小言_互联网的博客

c++ http通信使用CInternetSession整理

822人阅读  评论(0)

最近因为项目原因接触到http协议通信,边学边做,首先感谢

sunriver2000

大神封装好的类,可以直接调用接口进行通信,和源码对比着整理一下自己的收获

https://blog.csdn.net/sunriver2000/article/details/84670639

首先简单说明一下,当需要从服务器获取信息时候使用的是 “GET”,上传使用的是"POST"。

然后可以源码看到实际调用的是ExecuteRequest类

int CHttpClient::ExecuteRequest(int strMethod, LPCTSTR strUrl, LPCTSTR strPostData, CString &strResponse)  

其中

strMethod是方法 “GET”或者“POST”,

strUrl是地址,他应该是完整的,例“http://198.168.0.1::80/api/device/notify”

strPostData是要post上去的数据,当然GET的方法话是NULL

strResponse是服务器返回的数据;

然后用到AfxParaseURL函数分析strUrl字符串并返回其相应元素

AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort);  

 *分析 URL 字符串并返回类型及其元素
     *dwServiceType; 指示互联网服务的类型
     *strServer:接收待解析的URL服务器名
     *strObject: 接收待解析的URL 涉及的对象(可能为空)
     *nPort: 如果存在,则从URL的服务器或对象部分搜索出来
     *返回 如果URL是成功解析返回非0值
     *     如果URL为空的或不包含一个已知的Internet服务类型 返回0

例如“http://198.168.0.1::80/api/device/notify” 会分析出dwServiceType = AFX_INET_SERVICE_HTTP

strServer = 198.168.0.1,strObject = /api/device/notify,nPort = 80;

然后连接服务器,将strurl分析出来的元素填进去;

  m_pConnection = m_pSession->GetHttpConnection(strServer, dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_CONNECT : SECURE_CONNECT, nPort);

确定连接使用的方法 ,和路径。在这里如果我们是访问要登录网站的话,需要自己填上cookies,服务类型必须声明 就是在dwServiceType | INTERNET_FLAG_NO_COOKIES,使用就是第一次strPostData里放置账号和密码,返回的信息里面包含了cookies,将cookies取出来,下次访问时候再添加进请求头里面,下面会讲到。

m_pFile = m_pConnection->OpenRequest(strMethod, strObject, NULL, 1, NULL, NULL, (dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_REQUEST : 

 然后添加请求头信息

 m_pFile->AddRequestHeaders("Accept: */*,application/json");	
 m_pFile->AddRequestHeaders("Accept-Charset:UTF8");  
 m_pFile->AddRequestHeaders("Accept-Language: zh-cn;q=0.8,en;q=0.6,ja;q=0.4");  
 m_pFile->AddRequestHeaders("Content-Type:application/json");	

其中Content-Type:是根据发送的内容,如果发送的表单格式就要选择application/x-www-form-urlencoded

发送json格式 application/json

如果发送文件流就要选择multipart/form-data;boundary = ..

具体差别可以看这篇文章https://www.cnblogs.com/softidea/p/5745369.html

其中文件流的请求的一定要注意boundary分隔符 ,每个分隔符前面会多两短横线--,结束还会用一次分隔符 并且后面也加了两短横线--,示例

BASHPOST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

如果是要登录的网站,要加上cookies

就和上面一样

 m_pFile->AddRequestHeaders("Cookies: *******");	

接着就可以发送了,发送信息和信息长度,当然GET方法括号里面可以为空

 m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : strlen(strPostData));  

 然后是判断访问成功没有,成功的话返回的dwRet值为200;

m_pFile->QueryInfoStatusCode(dwRet); 

再然后就是解析服务器返回的信息

m_pFile->ReadString(strUtf8);
strResponse = UTF8AndUnicode_Convert(strUtf8, CP_UTF8, CP_ACP);

 如果是要登录的网站,登录成功后返回一个cookie,这个cookie就可以添加进请求头执行下次访问


转载:https://blog.csdn.net/qq_42237381/article/details/102390112
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场