(Translated by https://www.hiragana.jp/)
GitHub - zanllp/sion: A single-header, cross-platform C++ library for making asynchronous HTTP(s) Requests.
Skip to content
/ sion Public

A single-header, cross-platform C++ library for making asynchronous HTTP(s) Requests.

License

Notifications You must be signed in to change notification settings

zanllp/sion

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sion

ci PRs Welcome

直接ちょくせつ复制sion.hいた自己じこてき项目include

Include sion.h directly

GET

auto resp = sion::Fetch(url);
std::cout << resp.StrBody() << std::endl;
std::cout << resp.GetHeader().Get("content-type") << std::endl;

POST

auto resp = sion::Request()
                .SetBody(R"({ "hello": "world" })")
                .SetHeader("Content-type", "application/json")
                .SetUrl("http://www.httpbin.org/post")
                .SetHttpMethod("POST")
                .Send();
std::cout << resp.StrBody() << std::endl;

see main.cc for more example。さられい参考さんこうmain.cc

特性とくせい/feature

  • Sion一个轻量级简单易用的c++请求库
  • 仅单个头ぶんけん带std::stringてき扩展
  • またが平台ひらだい支持しじlinux, win, mac...
  • ゆう良好りょうこうてき异步支持しじ以选择以自己じこ欢的方式ほうしき发送异步请求, callback, await, 事件じけん循环, etc.
  • 支持しじぶんほん及二进制的响应体
  • 支持しじぶん块(chunked)てき传输编码
  • 支持しじFormData&单独てき二进制载荷请求
  • 支持しじhttp代理だいり
  • 支持しじhttp,https请求。https需要じゅようあんそうopenssl(推荐使用しようvcpkg),如果需要じゅよう使用しよう #define SION_DISABLE_SSL 关闭。如果使用しようりょう代理だいりそく使つかいぼつ启用ssl,也可以请もとめhttps链接。

用法ようほう

异步请求

sionざい此版ほんきさき对异增加ぞうかりょう巨大きょだいてき支持しじそう对于まえてき版本はんぽんきゅう保持ほじりょうどうapi+异步库的方式ほうしきつき可能かのう保持ほじ简单轻量,つきかん性能せいのう理想りそうただし性能せいのう从来就不sionてきさい先考せんこう虑的东西,ただし性能せいのう也不ざんたい 粗略そりゃくてき性能せいのう参考さんこう

sionてき异步支持しじ赖于sionないおけてきAsync线程函数かんすう参考さんこうAsync

さき启动线程线程

sion::Async async_thread_pool;

async_thread_pool.Start(); // 启动线程,创建线程,线程接受せつじゅにん务开はじめ工作こうさく

添加てんか请求いた线程,并接受せつじゅ响应

sion::Async处理异步ゆう3种方しき

  1. 使用しようかい
async_thread_pool.Run([=] { return sion::Request().SetUrl(url).SetHttpMethod(sion::Method::Get); },
                          [](sion::AsyncResponse async_resp) { std::cout << "AsyncCallback " << async_resp.resp.Status() << std::endl; });
  1. 使用しようawait

ざい无回调时ひさげ交任务到线程かいかえしかい给你いち个id,つう过这个idわが们可以使用しようawaitざいとうぜん线程上等じょうとうまち请求完成かんせい

auto id = async_thread_pool.Run([=] { return sion::Request().SetUrl(url).SetHttpMethod(sion::Method::Get); });
// ざいRunきさきてき这段时间さととうぜん线程以先其他てきかつとうまち需要じゅよう使用しよう响应时再使用しようawait获取响应。
auto pkg = async_thread_pool.Await(id);
std::cout << "AsyncAwait " << pkg.resp.GetHeader().Data().size() << pkg.err_msg << std::endl;
// 你可以给await添加てんかちょう时时间,如果ちょう时会ほうAsyncAwaitTimeout
try
{
    auto id = async_thread_pool.Run([=] { return sion::Request().SetUrl(url).SetHttpMethod(sion::Method::Get); });
    auto pkg = async_thread_pool.Await(id, 10);
}
catch (const std::exception& e)
{
    std::cerr << e.what() << '\n';
}
  1. 使用しようGetAvailableResponse

这种方式ほうしきどおり不断ふだん获取调取此函すうらい获取そうようてき响应,主要しゅよう还是方便ほうべんあずか事件じけん循环集成しゅうせい

const int num = 100;
for (size_t i = 0; i < num; i++)
{
    async_thread_pool.Run([=] { return sion::Request().SetUrl(url).SetHttpMethod(sion::Method::Get); });
}
int i = 0;
while (i <= num)
{
   std::this_thread::sleep_for(std::chrono::seconds(1));
   auto async_resps = async_thread_pool.GetAvailableResponse();
   if (async_resps.size())
   {
       i += async_resps.size();
       std::cout << "AsyncGetAvailableResponse got resp size:" << async_resps.size() << std::endl;
   }
}

AsyncResponse

上面うわつら几种方式ほうしき都会とかいかえしかいAsyncResponse,つう过这个可以获取异步请求てき响应たい,id,以及错误しんいき

さら多用たようほう

包含ほうがん普通ふつう请求,代理だいり,二进制数据发送,FormData,Asyncとう 查看参考さんこう

类&函数かんすうてい

Fetch

// せい态请もとめ方法ほうほう
Response Fetch(String url, Method method = Get, Header header = Header(), String body = "");

Response

该类ようらい处理请求响应

// かえしかい接收せっしゅういたてき响应たい
const vector<char>& Body();
// はた接收せっしゅういたてき响应たい转成くし,如果你能确保接收せっしゅういたてきすうすえくし直接ちょくせつ使用しよう这个
String StrBody();
String Code();
String Status();
int ContentLength();
const Header& GetHeader();// 获取响应头 参考さんこう [Header](#Header)

Request

该类ようらい处理发送请求

//支持しじ链式设置属性ぞくせい
Request& SetHttpMethod(String other) ;
Request& SetUrl(String url);
Request& SetBody(String body);  // 设置响应たいくし
Request& SetBody(Payload::Binary body);  // 设置响应たい进制ぶんけん
Request& SetBody(Payload::FormData body);  // 设置响应たいおもて单数すえ
Request& SetHeader(Header header);
Request& SetHeader(String k, String v);
Request& SetProxy(HttpProxy proxy); // 设置代理だいり,仅在http可用かよう
Response Send(); // 发送请求

Header

响应头和请求头

// 添加てんか一个键值对到头中
void Add(String k, String v);

// 获取头的键所对应てき所有しょゆう
vector<String> GetAll(String key);

// 获取头的键所对应てき值,以最きさきいち个为じゅん
String Get(String key);

//删除标键值对,かえしかいいち个bool指示しじ操作そうさ成功せいこう
bool Remove(String key);

// 删除所有しょゆうてき键值对
void RemoveAll(String key)

// かえし回数かいすうすえ本体ほんたい
const vector<pair<String, String>>& Data();

Async

该类依赖处sionてき异步请求,ないおけりょう个小がたてき线程提供ていきょうりょうcallback,await,事件じけん循环三种方式让你来处理异步的请求。线程かいざい析构时退出たいしゅつ启动てき所有しょゆう线程。

// 设置线程てき线程数量すうりょうそくのう够同时请もとめあるもの运行请求かい调的数量すうりょう, 如果进行较重てきかい调可以设おけなりstd::thread::hardware_concurrency(),以减しょう上下じょうげぶんきり换开销
Async& SetThreadNum(int num);

// 设置线程いけただしいや以阻ふさがとうぜん线程てき方式ほうしき运行
Async& SetBlock(bool wait);

// 设置awaitいやざい接收せっしゅういた包含ほうがん错误消息しょうそくてき响应时抛异常
Async& SetThrowIfHasErrMsg(bool op);

// 启动线程
void Start();

// 添加てんか一个请求到线程池的任务队列, かえしかいいち个请もとめてきid,id可用かよう于awaitあるもの查找对应てき请求
int Run(std::function<Request()> fn);

// 添加てんか一个请求和回调到线程池的任务队列,ざい请求完成かんせいきさきかいざい请求てき线程执行かい
void Run(std::function<Request()> fn, std::function<void(AsyncResponse)> cb);

//ざいとうぜん线程とうまちちょくいた标请もとめ可用かよう。id:Async::Runかえしかいてきid,timeout_ms ちょう时时间单毫秒,だま认永ちょう
AsyncResponse Await(int id, int timeout_ms);

// 获得とうぜん可用かようてき响应,如果你添加てんか一个请求到线程池的任务队列,且没ゆうかい调或しゃ使用しようawait获取,么可ようどおり过这种方しき获取。适用场合一般是在事件循环里面
vector<AsyncResponse>  GetAvailableResponse();

Payload

Payload名称めいしょうそら包含ほうがん2种请もとめたい可用かようてきすうすえ

namespace Payload
{
struct Binary
{
    std::vector<char> data; // かずすえ本体ほんたい
    String file_name; // ぶん件名けんめいざいひさげ交formdata如果うつしりょう,则会带上ぶん件名けんめいてきしんいき
    String type; // ぶんけんmime类型,如果うつしりょうざい直接ちょくせつ使用しよう二进制时会添加到正文的Content-Type,ざいformdata则是添加てんかいた部分ぶぶんてき
};

class FormData
{
    void Append(String name, Binary value); // 添加てんか一个新的二进制值
    void Append(String name, String value); // 添加てんか一个新的字符串键
    bool Remove(String key); // うつりじょいち项,かえしかい成功せいこう
    const std::vector<std::pair<String, std::vector<char>>>& Data() const; // かえし回数かいすうすえ本体ほんたい
};
}

String

该类继承std::string,用法ようほう基本きほん一致いっちつぶせてんりょう几个函数かんすう

//使用しようくし分割ぶんかつ
//flag 分割ぶんかつ标志,かえしかいてきくしむこうりょうかい剔除,flag要用ようようchar,かいじゅう不明ふめい
//num 分割ぶんかつ次数じすうだま认0そく分割ぶんかついた结束,れいnum=1,かえしかい开头到flag,flagいた结束size=2てきくしむこうりょう
//skip_empty とべ过空くしそく压入length==0てきくし
std::vector<String> Split(String flag, int num = -1, bool skip_empty = true);

//きよしじょぜんきさきてき
//target 需要じゅようきよしじょてきだま认空かくそらかくひめ换行
String Trim(String target = " \n\r");

//包含ほうがん字母じぼ
bool HasLetter();

// 转成しょううつしかえしかい一个新的字符串
String ToLowerCase();

// 转成だいうつしかえしかい一个新的字符串
String ToUpperCase();

//かえしかい搜索そうさくいたてき所有しょゆう位置いち
//flag 定位ていい标志
//num 搜索そうさく数量すうりょうだま认直いた结束
std::vector<int> FindAll(String flag, int num = -1);

//くしがえ换,かいおさむあらためはらゆうてきくし,而不かえしかいしんてき
String& Replace(String old_str, String new_str);

Proxy

struct HttpProxy
{
    int port; // 标端こう
    String host; // 标主つくえ,ip
};

粗略そりゃくてき性能せいのう参考さんこう

12しょう时请もとめ270まんうらないようないそん10m,cpu负载2%左右さゆう。cpuAMD Ryzen 7 PRO 4750U PF9Q_G L~B_EFDKL2 X9 XL

About

A single-header, cross-platform C++ library for making asynchronous HTTP(s) Requests.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published