转抄自:http://blog.csdn.net/elaine_bao/article/details/51754882
实现HTTP访问的流程包括以下几步:
1, 首先我们打开一个Session获得一个HINTERNET session句柄;
2, 然后我们使用这个session句柄与服务器连接得到一个HINTERNET connect句柄;
3, 然后我们使用这个connect句柄来打开Http请求得到一个HINTERNET request句柄;
4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据;
5, 最后依次关闭request,connect,session句柄。
微软提供了两套http访问的接口:WinHTTP和WinINet。WinHTTP比WinINet更加安全和健壮,可以认为WinHTTP是WinINet的升级版本。这两套API包含了很多相似的函数与宏定义,访问的流程也是完全类似的(上述5步)。本文主要通过WinHTTP实现post请求方法,严格按照上述5个步骤给大家进行讲解。
又由于我所接收到的数据是UTF8而不是ASCII码,因此一开始接收到的数据存在乱码。在下述代码中我会详细解释出现乱码的原因以及如何解决。
好,小二,上代码!
#include "stdafx.h"#include "jsonparser.h"#include <string>#include <windows.h>#include <winhttp.h>#pragma comment(lib, "winhttp.lib")int _tmain(int argc, _TCHAR* argv[]){ HINTERNET hSession = NULL; HINTERNET hConnect = NULL; HINTERNET hRequest = NULL; hSession = WinHttpOpen(L"csdn@elaine_bao", NULL, NULL, NULL, NULL); if (hSession == NULL) { cout<<"Error:Open session failed: "<<GetLastError()<<endl; return -1; } hConnect = WinHttpConnect(hSession, L"192.168.50.112", (INTERNET_PORT)8080, 0); if (hConnect == NULL) { cout << "Error:Connect failed: " << GetLastError()<<endl; return -1; } hRequest = WinHttpOpenRequest(hConnect, L"Post", L"getServiceInfo", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); if (hRequest == NULL) { cout << "Error:OpenRequest failed: " << GetLastError() << endl; return -1; } string data = "This is my data to be sent"; const void *ss = (const char *)data.c_str(); BOOL bResults; bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, const_cast<void*>(ss), data.length(), data.length(), 0); if (!bResults){ cout << "Error:SendRequest failed: " << GetLastError() << endl; return -1; } else{ bResults = WinHttpReceiveResponse(hRequest, NULL); } LPVOID lpHeaderBuffer = NULL; DWORD dwSize = 0; if (bResults) { WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX); if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { lpHeaderBuffer = new WCHAR[dwSize / sizeof(WCHAR)]; bResults = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, lpHeaderBuffer, &dwSize, WINHTTP_NO_HEADER_INDEX); } } printf("Header contents: \n%S", lpHeaderBuffer); LPSTR pszOutBuffer = NULL; DWORD dwDownloaded = 0; wchar_t *pwText = NULL; if (bResults) { do { dwSize = 0; if (!WinHttpQueryDataAvailable(hRequest, &dwSize)){ cout << "Error:WinHttpQueryDataAvailable failed:" << GetLastError() << endl; break; } if (!dwSize) break; pszOutBuffer = new char[dwSize + 1]; if (!pszOutBuffer){ cout<<"Out of memory."<<endl; break; } ZeroMemory(pszOutBuffer, dwSize + 1); if (!WinHttpReadData(hRequest,pszOutBuffer, dwSize, &dwDownloaded)){ cout << "Error:WinHttpQueryDataAvailable failed:" << GetLastError() << endl; } if (!dwDownloaded) break; } while (dwSize > 0); DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, pszOutBuffer, -1, NULL, 0); pwText = new wchar_t[dwNum]; MultiByteToWideChar(CP_UTF8, 0, pszOutBuffer, -1, pwText, dwNum); printf("Received contents: \n%S", pwText); } if (hRequest) WinHttpCloseHandle(hRequest); if (hConnect) WinHttpCloseHandle(hConnect); if (hSession) WinHttpCloseHandle(hSession); return 0;}