日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++使用winhttp以POST/GET方法实现报文转发与接收

發布時間:2023/12/20 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++使用winhttp以POST/GET方法实现报文转发与接收 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里僅僅是我的開發的一點經驗,
C++通過httppost實現接口信息交互。

目錄

  • 準備
    • 其他情況
  • 代碼實現
    • 包含文件
    • 實現代碼
      • 函數解釋
  • 調用注意事項

準備

c++調用httppost方法實現報文轉發接收之前的準備工作,先通過postman測試接口是否連通。

這里的是地址+端口+接口 后面一定要加上 ?param=
然后看返回的報文是否正確

其他情況

如果電腦沒有postman可以用ie瀏覽器代替,地址+端口+接口 后面一定要加上 ?param= +發送報文,回車查看頁面。

代碼實現

包含文件

下面 包含的頭文件與lib文件。

#include <winhttp.h> #pragma comment(lib,"winhttp.lib")

實現代碼

下面 實現代碼部分。

//http post方法發送文本 //host ip或者網址 //port 端口號 //path 資源地址. 如:www.baidu.com/HELLO/中的 HELLO/ //send 發送的內容(body部分) //resp 接收的內容(body部分) int HttpPost(CString host, int port, CString path, CString send, CString & resp) {DWORD dwSize = 0;DWORD dwDownloaded = 0;HINTERNET hSession = NULL;HINTERNET hConnect = NULL;HINTERNET hRequest = NULL;BOOL bResults = FALSE;int ret = 0;hSession = WinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);if (NULL == hSession) {return -1;}hConnect = WinHttpConnect(hSession, host, port, 0);if (NULL == hConnect) {WinHttpCloseHandle(hSession);return -1;}CString a = path + send;//hRequest = WinHttpOpenRequest(hConnect, _T("POST"), a, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);//httpshRequest = WinHttpOpenRequest(hConnect, _T("POST"), a, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);//httpif (NULL == hRequest) {WinHttpCloseHandle(hSession);WinHttpCloseHandle(hConnect);return -1;}LPCWSTR header = _T("Content-type: text/plain; charset=utf-8/r/n");SIZE_T len = lstrlenW(header);bResults = WinHttpAddRequestHeaders(hRequest, header, DWORD(len), WINHTTP_ADDREQ_FLAG_ADD);if (!bResults) {ret = -1;WinHttpCloseHandle(hSession);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hRequest);return -1;}USES_CONVERSION;char * sbuf = T2A(send);int slen = strlen(sbuf);bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, NULL, 0, slen, 0);if (!bResults) {ret = -1;WinHttpCloseHandle(hSession);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hRequest);return -1;}bResults = WinHttpReceiveResponse(hRequest, NULL);if (!bResults) {ret = -1;WinHttpCloseHandle(hSession);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hRequest);return -1;}const int mxlen = 10240;char const * pszOutBuffer = new char[10240];if (NULL == pszOutBuffer) {WinHttpCloseHandle(hSession);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hRequest);return -1;}char* p = (char*)pszOutBuffer;ZeroMemory(p, mxlen);int cnt = 0;do{dwSize = 0;if (!WinHttpQueryDataAvailable(hRequest, &dwSize)){//printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError());break;}if (!dwSize)break;if (WinHttpReadData(hRequest, (LPVOID)(p + cnt), dwSize, &dwDownloaded)){cnt += dwSize;//printf("Error %u in WinHttpReadData.\n", GetLastError());}else {//printf("Error %u in WinHttpReadData.\n", GetLastError());}if (!dwDownloaded)break;} while (dwSize > 0);resp = CString(pszOutBuffer);resp = U8ToUnicode(T2A(resp));delete[] pszOutBuffer;WinHttpCloseHandle(hSession);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hRequest);return 0; }

函數解釋

WinHttpOpen 打開函數返回值為句柄
WinHttpConnect(hSession(句柄), host(地址), port(端口號), 0) 連接函數
WinHttpOpenRequest(hConnect, _T(“POST”)(NULL則是GET), a(調用接口+數據), _T(“HTTP/1.1”), WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0(0為http,WINHTTP_FLAG_SECURE為https)) 創建一個http請求處理
WinHttpAddRequestHeaders(hRequest, header(請求的頭域字符串), DWORD(len)(頭域長度), WINHTTP_ADDREQ_FLAG_ADD) 添加一個HTTP的請求頭域
WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS(請求頭域), 0(頭域長度), NULL, 0(沒有數據發送時,設置為0), slen(總發送的數據的長度), 0()) 發送請求數據
WinHttpReceiveResponse(hRequest, NULL)
通過調用WinHttpOpenRequest且調用WinHttpSendRequest返回的句柄 等待WinHttpSendRequest發送完成時調用WinHttpReceiveResponse
WinHttpQueryDataAvailable(hRequest, &dwSize) 請求返回的數據量,以字節為位進行讀取
WinHttpReadData(hRequest, (LPVOID)(p + cnt)(接收數據的緩沖區), dwSize(緩沖區大小長度), &dwDownloaded(傳出接收的字節數)) 讀取返回的數據
WinHttpCloseHandle(句柄) 關閉一個HINTERNET句柄
更詳細的函數說明查看:https://blog.csdn.net/fengsh998/article/details/8201591

調用注意事項

在使用**WinHttpReadData()**函數的時候,有可能一次接收的數據不完整,則需要設置循環接收直到緩沖區大小長度為0;
一般httppost發送的報文為UTF-8,而我們需要發送的報文為GBK格式,所以發送的報文和接收的報文需要做處理,不然返回數據為亂碼,或者發送報文數據不正確。

總結

以上是生活随笔為你收集整理的C++使用winhttp以POST/GET方法实现报文转发与接收的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。