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方法实现报文转发与接收的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国雾霾 China smog_ Sk
- 下一篇: GitHub部署静态网页