学习UNIX网络编程时写的C++客户端请求库,使用的是原生的Socket API。
库的名字来源于Python著名的requests库,该库的API设计也与该库相似。
最简单的一个GET请求
requests::HttpResponsePtr r = requests::get("https://api.github.com/events");我们得到的是一个Response的智能指针,我们可以得到这个Response的正文、报头以及响应码
正文为std::string类型,响应码为int类型
std::cout << r->statusCode << std::endl;
std::cout << r->text << std::endl;当我们用GET发送数据时,数据会以urlencoded的方式发送
例如,http://httpbin.org/get?key1=val1&key2=val2
我们可以创建一个RequestOption对象传递paramsPtr参数,该库使用的JSON库为RapidJSON
rapidjson::Document d;
d.Parse(R"({"test":"test","hello":"world"})");
requests::RequestOption requestOption;
requestOption.paramsPtr = &d;
requests::HttpResponsePtr r = requests::get("http://httpbin.org/get", requestOption)要定制请求头,我们需要先创建一个Headers对象,Headers对象为std::map<std::string, std::string>类型
requests::Headers headers;
headers["User-Agent"] =
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like "
"Gecko) "
"Chrome/74.0.3729.157 Safari/537.36";
requests::RequestOption requestOption;
requestOption.headersPtr = &headers;
requests::HttpResponsePtr r = requests::get("http://httpbin.org/get", requestOption)要打印headers,可以像操作std::map一样打印
for (auto &p : r->headers) {
std::cout << p.first << ": " << p.second << std::endl;
}POST发送数据时,有两种方式,分别为x-www-form-urlencoded和json方式
前者为将json转化为urlencoded形式的data发送,而后者则是将json序列化后直接发送数据
我们首先创建RequestOption和待发送的JSON对象
requests::RequestOption requestOption;
rapidjson::Document d;
d.Parse(R"({"test":"test","hello":"world"})");以x-www-form-urlencoded方式发送:
requestOption.dataPtr = &d;
requests::HttpResponsePtr r = post("http://httpbin.org/post", requestOption);以json方式发送:
requestOption.jsonPtr = &d;
requests::HttpResponsePtr r = post("http://httpbin.org/post", requestOption);- GET
- HTTPS支持
- POST
- 编码转换
- Keep-Alive的Connection
- 错误处理