include
Include sion.h directly
auto resp = sion::Fetch(url);
std::cout << resp.StrBody() << std::endl;
std::cout << resp.GetHeader().Get("content-type") << std::endl;
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;
- 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
sion
sion::Async async_thread_pool;
async_thread_pool.Start(); // 启动线程池 ,创建子 线程,子 线程接受 任 务开始 工作
sion::Async处理异步
使用 回 调
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; });
使用 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';
}
使用 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;
}
}
// 静 态请求 方法
Response Fetch(String url, Method method = Get, Header header = Header(), String body = "");
该类
// 返 回 接收 到 的 响应体
const vector<char>& Body();
// 将 接收 到 的 响应体 转成字 符 串 ,如果你能确保接收 到 的 数 据 是 字 符 串 ,可 以直接 使用 这个
String StrBody();
String Code();
String Status();
int ContentLength();
const Header& GetHeader();// 获取响应头 参考 [Header](#Header)
该类
//支持 链式设置属性
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(); // 发送请求
响应头和请求头
// 添加 一个键值对到头中
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();
该类依赖处
// 设置线程池 的 线程数量 ,即 能 够同时请求 或 者 是 运行请求回 调的数量 , 如果进行比 较重的 回 调可以设置 成 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
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; // 返 回数 据 本体
};
}
该类继承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
};