原因:由于涉及到使用libcurl进行http交互,故在此进行记录调用流程
概况:利用curl模块实现http请求
http介绍:(hyperText Transfer Protocol超文本传输协议)定义在应用层,底层基于TCP/IP协议,且是一个无状态的协议,永远都是客户端发起请求,服务器响应。http消息由客户端到服务器的请求和服务器到客户端响应组成。请求消息和响应消息都是由开始行(对于请求消息开始行就是请求行,对于响应消息开始行就是状态行)(必须有),消息报头(可以有),消息正文(可以有)组成。如下:
下面为请求信息:具体信息解释如下:
GET /web.html HTTP/1.1:客户端请求方式,请求资源名称,http协议的版本号。其中请求方式有get,post,put,delete等方法,get:从指定的资源请求数据,post:向指定的资源提交要被处理的数据,get一般用于信息获取,而post一般为更新资源信息,且get传输的数据通过url一起拼接传递,而post则放到body中,故post安全性更高,也导致了get数据长度有限。
请求头包含服务器地址和本地设备的信息等。
Accept:客户端支持的数据类型,Accept-Encoding:客户端支持的数据压缩格式,Accpet-Language:客户端支持的语言
User-Agent:客户端软件环境,Connection:是否保持长连接。接下来一个换行,然后紧跟着正文。
下面为应答信息:相应信息包括一个状态行,若干个消息头,以及body内容。
Server:服务器类型 Content-Length:返回数据长度,
接下来就是curl的调用流程:
导入文件和动态库
#include "curl/curl.h"
#pragma comment(lib,“libcurl.lib”)
定义一个CURL对象,并进行初始化.
CURL *pcurl = nullptr;
pcurl = curl_easy_init();
设置请求行和消息报头,消息body等。
//设置请求类型
curl_easy_setopt(pcurl, CURLOPT_CUSTOMREQUEST, "POST");
//设置请求头
curl_slist *plist = nullptr;
plist = curl_slist_append(plist, "Accept:");
plist = curl_slist_append(plist, "content_type:");
curl_easy_setopt(pcurl, CURLOPT_HTTPHEADER, plist);
//设置url
curl_easy_setopt(pcurl, CURLOPT_URL, url.c_str());
//设置附加信息
curl_easy_setopt(pcurl, CURLOPT_POSTFIELDSIZE, strlen(hello));
curl_easy_setopt(pcurl, CURLOPT_POSTFIELDS, hello);
设置获取接收返回的消息头和消息正文的方法,需要手动实现解析方法和设置接收信息的对象
size_t write_data(void *buffer,size_t size,size_t nmemb,void *userp)
{
char *d = (char *)buffer;
string *str = (string *)userp;
if (str != nullptr)
{
str->append(d, size *nmemb);
return size *nmemb;
}
return 0;
}
string header,result;
//设置头信息返回
curl_easy_setopt(pcurl, CURLOPT_HEADERFUNCTION, &write_data);
curl_easy_setopt(pcurl, CURLOPT_HEADERDATA, &header);
//设置信息返回
curl_easy_setopt(pcurl, CURLOPT_WRITEFUNCTION, &write_data);
curl_easy_setopt(pcurl, CURLOPT_WRITEDATA, &result);
进行http请求,请求完成后返回信息可以在内部实现的write_data中解析
int re = curl_easy_perform(pcurl);
是否句柄对象
//释放句柄
curl_easy_cleanup(pcurl);
总结:以上就是利用curl模块实现http请求的简单流程。