Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c+中使用winhttp将json数据发布到api+; 我需要使用C++将JSON数据发布到API。在API中,我还需要包含app\u id和app\u key作为标题。下面是我正在使用的代码: std::wstring get_utf16(const std::string &str, int codepage) { if (str.empty()) return std::wstring(); int sz = MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), 0, 0); std::wstring res(sz, 0); MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), &res[0], sz); return res; } LPCWSTR additionalHeaders = L"Content-Type: application/json\r\n" + L"app_id: 7ty44" + L"app_key: e36ff19de5623"; DWORD headersLength = -1; string HttpsWebRequestPost(string domain, string url, string dat) { //Extra LPSTR data = const_cast<char *>(dat.c_str());; DWORD data_len = strlen(data); wstring sdomain = get_utf16(domain, CP_UTF8); wstring surl = get_utf16(url, CP_UTF8); string response; DWORD dwSize = 0; DWORD dwDownloaded = 0; LPSTR pszOutBuffer; BOOL bResults = FALSE; HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL; // Use WinHttpOpen to obtain a session handle. hSession = WinHttpOpen(L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); // Specify an HTTP server. if (hSession) hConnect = WinHttpConnect(hSession, sdomain.c_str(), INTERNET_DEFAULT_HTTP_PORT, 0); // Create an HTTP request handle. if (hConnect) hRequest = WinHttpOpenRequest(hConnect, L"POST", surl.c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); // Send a request. if (hRequest) bResults = WinHttpSendRequest(hRequest, additionalHeaders, headersLength, (LPVOID)data, data_len, data_len, 0); // End the request. if (bResults) bResults = WinHttpReceiveResponse(hRequest, NULL); // Keep checking for data until there is nothing left. if (bResults) { do { // Check for available data. dwSize = 0; if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError()); // Allocate space for the buffer. pszOutBuffer = new char[dwSize + 1]; if (!pszOutBuffer) { printf("Out of memory\n"); dwSize = 0; } else { // Read the data. ZeroMemory(pszOutBuffer, dwSize + 1); if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)) printf("Error %u in WinHttpReadData.\n", GetLastError()); else //printf("%s", pszOutBuffer); response = response + string(pszOutBuffer); // Free the memory allocated to the buffer. delete[] pszOutBuffer; } } while (dwSize > 0); } // Report any errors. if (!bResults) printf("Error %d has occurred.\n", GetLastError()); // Close any open handles. if (hRequest) WinHttpCloseHandle(hRequest); if (hConnect) WinHttpCloseHandle(hConnect); if (hSession) WinHttpCloseHandle(hSession); return response; } std::wstring get_utf16(常量std::string&str,int代码页) { if(str.empty())返回std::wstring(); int sz=MultiByteToWideChar(代码页,0,&str[0],(int)str.size(),0,0); std::wstring res(sz,0); MultiByteToWideChar(代码页,0,&str[0],(int)str.size(),&res[0],sz); 返回res; } LPCWSTR additionalHeaders=L“内容类型:应用程序/json\r\n”+L“应用程序id:7ty44”+L“应用程序密钥:e36ff19de5623”; DWORD headersLength=-1; 字符串HttpsWebRequestPost(字符串域、字符串url、字符串数据) { //额外的 LPSTR data=const_cast(dat.c_str());; DWORD data_len=strlen(数据); wstring sdomain=get_utf16(域,CP_UTF8); wstring surl=get_utf16(url,CP_UTF8); 字符串响应; DWORD dwSize=0; DWORD=0; LPSTR-pszOutBuffer; BOOL-bResults=FALSE; HINTERNET hSession=NULL, hConnect=NULL, hRequest=NULL; //使用WinHttpOpen获取会话句柄。 hSession=WinHttpOpen(L“WinHTTP示例/1.0”, WINHTTP\u访问\u类型\u默认\u代理, WINHTTP\u无\u代理\u名称, WINHTTP\u无\u代理\u旁路,0); //指定HTTP服务器。 如果(hsSession) hConnect=WinHttpConnect(hSession,sdomain.c_str(), INTERNET\u默认\u HTTP\u端口,0); //创建HTTP请求句柄。 如果(hConnect) hRequest=WinHttpOpenRequest(hConnect,L“POST”,surl.c_str(), NULL,WINHTTP\u无\u引用程序, WINHTTP\u默认\u接受\u类型, 0); //发送请求。 如果(hRequest) bResults=WinHttpSendRequest(hRequest, 附加标题, 头长, (LPVOID)数据, 数据线, 数据线, 0); //结束请求。 如果(b结果) bResults=WinHttpReceiveResponse(hRequest,NULL); //继续检查数据,直到什么都没有了。 如果(b结果) { 做 { //检查可用数据。 dwSize=0; 如果(!WinHttpQueryDataAvailable(hRequest和dwSize)) printf(“WinHttpQueryDataAvailable中出现错误%u。\n”, GetLastError()); //为缓冲区分配空间。 pszOutBuffer=新字符[dwSize+1]; 如果(!pszOutBuffer) { printf(“内存不足\n”); dwSize=0; } 其他的 { //读取数据。 零内存(pszOutBuffer,dwSize+1); 如果(!WinHttpReadData(hRequest,(LPVOID)pszOutBuffer, dwSize和dwSize) printf(“WinHttpReadData中的错误%u。\n”,GetLastError()); 其他的 //printf(“%s”,pszOutBuffer); 响应=响应+字符串(pszOutBuffer); //释放分配给缓冲区的内存。 删除[]pszOutBuffer; } }而(dwSize>0); } //报告任何错误。 如果(!bResults) printf(“发生了错误%d。\n”,GetLastError()); //关闭所有打开的手柄。 if(hRequest)WinHttpCloseHandle(hRequest); if(hConnect)WinHttpCloseHandle(hConnect); if(hSession)WinHttpCloseHandle(hSession); 返回响应; }_C++_Winapi_Https - Fatal编程技术网 0); } //报告任何错误。 如果(!bResults) printf(“发生了错误%d。\n”,GetLastError()); //关闭所有打开的手柄。 if(hRequest)WinHttpCloseHandle(hRequest); if(hConnect)WinHttpCloseHandle(hConnect); if(hSession)WinHttpCloseHandle(hSession); 返回响应; },c++,winapi,https,C++,Winapi,Https" /> 0); } //报告任何错误。 如果(!bResults) printf(“发生了错误%d。\n”,GetLastError()); //关闭所有打开的手柄。 if(hRequest)WinHttpCloseHandle(hRequest); if(hConnect)WinHttpCloseHandle(hConnect); if(hSession)WinHttpCloseHandle(hSession); 返回响应; },c++,winapi,https,C++,Winapi,Https" />

如何在c+中使用winhttp将json数据发布到api+; 我需要使用C++将JSON数据发布到API。在API中,我还需要包含app\u id和app\u key作为标题。下面是我正在使用的代码: std::wstring get_utf16(const std::string &str, int codepage) { if (str.empty()) return std::wstring(); int sz = MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), 0, 0); std::wstring res(sz, 0); MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), &res[0], sz); return res; } LPCWSTR additionalHeaders = L"Content-Type: application/json\r\n" + L"app_id: 7ty44" + L"app_key: e36ff19de5623"; DWORD headersLength = -1; string HttpsWebRequestPost(string domain, string url, string dat) { //Extra LPSTR data = const_cast<char *>(dat.c_str());; DWORD data_len = strlen(data); wstring sdomain = get_utf16(domain, CP_UTF8); wstring surl = get_utf16(url, CP_UTF8); string response; DWORD dwSize = 0; DWORD dwDownloaded = 0; LPSTR pszOutBuffer; BOOL bResults = FALSE; HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL; // Use WinHttpOpen to obtain a session handle. hSession = WinHttpOpen(L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); // Specify an HTTP server. if (hSession) hConnect = WinHttpConnect(hSession, sdomain.c_str(), INTERNET_DEFAULT_HTTP_PORT, 0); // Create an HTTP request handle. if (hConnect) hRequest = WinHttpOpenRequest(hConnect, L"POST", surl.c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); // Send a request. if (hRequest) bResults = WinHttpSendRequest(hRequest, additionalHeaders, headersLength, (LPVOID)data, data_len, data_len, 0); // End the request. if (bResults) bResults = WinHttpReceiveResponse(hRequest, NULL); // Keep checking for data until there is nothing left. if (bResults) { do { // Check for available data. dwSize = 0; if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError()); // Allocate space for the buffer. pszOutBuffer = new char[dwSize + 1]; if (!pszOutBuffer) { printf("Out of memory\n"); dwSize = 0; } else { // Read the data. ZeroMemory(pszOutBuffer, dwSize + 1); if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)) printf("Error %u in WinHttpReadData.\n", GetLastError()); else //printf("%s", pszOutBuffer); response = response + string(pszOutBuffer); // Free the memory allocated to the buffer. delete[] pszOutBuffer; } } while (dwSize > 0); } // Report any errors. if (!bResults) printf("Error %d has occurred.\n", GetLastError()); // Close any open handles. if (hRequest) WinHttpCloseHandle(hRequest); if (hConnect) WinHttpCloseHandle(hConnect); if (hSession) WinHttpCloseHandle(hSession); return response; } std::wstring get_utf16(常量std::string&str,int代码页) { if(str.empty())返回std::wstring(); int sz=MultiByteToWideChar(代码页,0,&str[0],(int)str.size(),0,0); std::wstring res(sz,0); MultiByteToWideChar(代码页,0,&str[0],(int)str.size(),&res[0],sz); 返回res; } LPCWSTR additionalHeaders=L“内容类型:应用程序/json\r\n”+L“应用程序id:7ty44”+L“应用程序密钥:e36ff19de5623”; DWORD headersLength=-1; 字符串HttpsWebRequestPost(字符串域、字符串url、字符串数据) { //额外的 LPSTR data=const_cast(dat.c_str());; DWORD data_len=strlen(数据); wstring sdomain=get_utf16(域,CP_UTF8); wstring surl=get_utf16(url,CP_UTF8); 字符串响应; DWORD dwSize=0; DWORD=0; LPSTR-pszOutBuffer; BOOL-bResults=FALSE; HINTERNET hSession=NULL, hConnect=NULL, hRequest=NULL; //使用WinHttpOpen获取会话句柄。 hSession=WinHttpOpen(L“WinHTTP示例/1.0”, WINHTTP\u访问\u类型\u默认\u代理, WINHTTP\u无\u代理\u名称, WINHTTP\u无\u代理\u旁路,0); //指定HTTP服务器。 如果(hsSession) hConnect=WinHttpConnect(hSession,sdomain.c_str(), INTERNET\u默认\u HTTP\u端口,0); //创建HTTP请求句柄。 如果(hConnect) hRequest=WinHttpOpenRequest(hConnect,L“POST”,surl.c_str(), NULL,WINHTTP\u无\u引用程序, WINHTTP\u默认\u接受\u类型, 0); //发送请求。 如果(hRequest) bResults=WinHttpSendRequest(hRequest, 附加标题, 头长, (LPVOID)数据, 数据线, 数据线, 0); //结束请求。 如果(b结果) bResults=WinHttpReceiveResponse(hRequest,NULL); //继续检查数据,直到什么都没有了。 如果(b结果) { 做 { //检查可用数据。 dwSize=0; 如果(!WinHttpQueryDataAvailable(hRequest和dwSize)) printf(“WinHttpQueryDataAvailable中出现错误%u。\n”, GetLastError()); //为缓冲区分配空间。 pszOutBuffer=新字符[dwSize+1]; 如果(!pszOutBuffer) { printf(“内存不足\n”); dwSize=0; } 其他的 { //读取数据。 零内存(pszOutBuffer,dwSize+1); 如果(!WinHttpReadData(hRequest,(LPVOID)pszOutBuffer, dwSize和dwSize) printf(“WinHttpReadData中的错误%u。\n”,GetLastError()); 其他的 //printf(“%s”,pszOutBuffer); 响应=响应+字符串(pszOutBuffer); //释放分配给缓冲区的内存。 删除[]pszOutBuffer; } }而(dwSize>0); } //报告任何错误。 如果(!bResults) printf(“发生了错误%d。\n”,GetLastError()); //关闭所有打开的手柄。 if(hRequest)WinHttpCloseHandle(hRequest); if(hConnect)WinHttpCloseHandle(hConnect); if(hSession)WinHttpCloseHandle(hSession); 返回响应; }

如何在c+中使用winhttp将json数据发布到api+; 我需要使用C++将JSON数据发布到API。在API中,我还需要包含app\u id和app\u key作为标题。下面是我正在使用的代码: std::wstring get_utf16(const std::string &str, int codepage) { if (str.empty()) return std::wstring(); int sz = MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), 0, 0); std::wstring res(sz, 0); MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), &res[0], sz); return res; } LPCWSTR additionalHeaders = L"Content-Type: application/json\r\n" + L"app_id: 7ty44" + L"app_key: e36ff19de5623"; DWORD headersLength = -1; string HttpsWebRequestPost(string domain, string url, string dat) { //Extra LPSTR data = const_cast<char *>(dat.c_str());; DWORD data_len = strlen(data); wstring sdomain = get_utf16(domain, CP_UTF8); wstring surl = get_utf16(url, CP_UTF8); string response; DWORD dwSize = 0; DWORD dwDownloaded = 0; LPSTR pszOutBuffer; BOOL bResults = FALSE; HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL; // Use WinHttpOpen to obtain a session handle. hSession = WinHttpOpen(L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); // Specify an HTTP server. if (hSession) hConnect = WinHttpConnect(hSession, sdomain.c_str(), INTERNET_DEFAULT_HTTP_PORT, 0); // Create an HTTP request handle. if (hConnect) hRequest = WinHttpOpenRequest(hConnect, L"POST", surl.c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); // Send a request. if (hRequest) bResults = WinHttpSendRequest(hRequest, additionalHeaders, headersLength, (LPVOID)data, data_len, data_len, 0); // End the request. if (bResults) bResults = WinHttpReceiveResponse(hRequest, NULL); // Keep checking for data until there is nothing left. if (bResults) { do { // Check for available data. dwSize = 0; if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError()); // Allocate space for the buffer. pszOutBuffer = new char[dwSize + 1]; if (!pszOutBuffer) { printf("Out of memory\n"); dwSize = 0; } else { // Read the data. ZeroMemory(pszOutBuffer, dwSize + 1); if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)) printf("Error %u in WinHttpReadData.\n", GetLastError()); else //printf("%s", pszOutBuffer); response = response + string(pszOutBuffer); // Free the memory allocated to the buffer. delete[] pszOutBuffer; } } while (dwSize > 0); } // Report any errors. if (!bResults) printf("Error %d has occurred.\n", GetLastError()); // Close any open handles. if (hRequest) WinHttpCloseHandle(hRequest); if (hConnect) WinHttpCloseHandle(hConnect); if (hSession) WinHttpCloseHandle(hSession); return response; } std::wstring get_utf16(常量std::string&str,int代码页) { if(str.empty())返回std::wstring(); int sz=MultiByteToWideChar(代码页,0,&str[0],(int)str.size(),0,0); std::wstring res(sz,0); MultiByteToWideChar(代码页,0,&str[0],(int)str.size(),&res[0],sz); 返回res; } LPCWSTR additionalHeaders=L“内容类型:应用程序/json\r\n”+L“应用程序id:7ty44”+L“应用程序密钥:e36ff19de5623”; DWORD headersLength=-1; 字符串HttpsWebRequestPost(字符串域、字符串url、字符串数据) { //额外的 LPSTR data=const_cast(dat.c_str());; DWORD data_len=strlen(数据); wstring sdomain=get_utf16(域,CP_UTF8); wstring surl=get_utf16(url,CP_UTF8); 字符串响应; DWORD dwSize=0; DWORD=0; LPSTR-pszOutBuffer; BOOL-bResults=FALSE; HINTERNET hSession=NULL, hConnect=NULL, hRequest=NULL; //使用WinHttpOpen获取会话句柄。 hSession=WinHttpOpen(L“WinHTTP示例/1.0”, WINHTTP\u访问\u类型\u默认\u代理, WINHTTP\u无\u代理\u名称, WINHTTP\u无\u代理\u旁路,0); //指定HTTP服务器。 如果(hsSession) hConnect=WinHttpConnect(hSession,sdomain.c_str(), INTERNET\u默认\u HTTP\u端口,0); //创建HTTP请求句柄。 如果(hConnect) hRequest=WinHttpOpenRequest(hConnect,L“POST”,surl.c_str(), NULL,WINHTTP\u无\u引用程序, WINHTTP\u默认\u接受\u类型, 0); //发送请求。 如果(hRequest) bResults=WinHttpSendRequest(hRequest, 附加标题, 头长, (LPVOID)数据, 数据线, 数据线, 0); //结束请求。 如果(b结果) bResults=WinHttpReceiveResponse(hRequest,NULL); //继续检查数据,直到什么都没有了。 如果(b结果) { 做 { //检查可用数据。 dwSize=0; 如果(!WinHttpQueryDataAvailable(hRequest和dwSize)) printf(“WinHttpQueryDataAvailable中出现错误%u。\n”, GetLastError()); //为缓冲区分配空间。 pszOutBuffer=新字符[dwSize+1]; 如果(!pszOutBuffer) { printf(“内存不足\n”); dwSize=0; } 其他的 { //读取数据。 零内存(pszOutBuffer,dwSize+1); 如果(!WinHttpReadData(hRequest,(LPVOID)pszOutBuffer, dwSize和dwSize) printf(“WinHttpReadData中的错误%u。\n”,GetLastError()); 其他的 //printf(“%s”,pszOutBuffer); 响应=响应+字符串(pszOutBuffer); //释放分配给缓冲区的内存。 删除[]pszOutBuffer; } }而(dwSize>0); } //报告任何错误。 如果(!bResults) printf(“发生了错误%d。\n”,GetLastError()); //关闭所有打开的手柄。 if(hRequest)WinHttpCloseHandle(hRequest); if(hConnect)WinHttpCloseHandle(hConnect); if(hSession)WinHttpCloseHandle(hSession); 返回响应; },c++,winapi,https,C++,Winapi,Https,我已将app_id和app_key包含在附加标题中,但不确定这是否正确。另外,我如何通过传递需要发送的json数据来调用它。我没有找到任何好的工作例子。谢谢L“内容类型:应用程序/json\r\n”+L“应用程序id:7ty44”+L“应用程序密钥:e36ff19de5623” 那是行不通的。C++确实有字符串类型,但是这里使用字符串文字。它们的类型为wchar\u t[LENGTH],即它们由字符数组固定。与字符串类型不同,它们没有运算符+ 相反,编译器将连接相邻的字符串文字: LPCWSTR

我已将
app_id
app_key
包含在
附加标题中,但不确定这是否正确。另外,我如何通过传递需要发送的json数据来调用它。我没有找到任何好的工作例子。谢谢

L“内容类型:应用程序/json\r\n”+L“应用程序id:7ty44”+L“应用程序密钥:e36ff19de5623”

那是行不通的。C++确实有字符串类型,但是这里使用字符串文字。它们的类型为
wchar\u t[LENGTH]
,即它们由字符数组固定。与字符串类型不同,它们没有
运算符+

相反,编译器将连接相邻的字符串文字:

LPCWSTR additionalHeaders = 
    L"Content-Type: application/json\r\n"
    L"app_id: 7ty44\r\n"
    L"app_key: e36ff19de5623\r\n"; // << Only this line has a ;
LPCWSTR附加头=
L“内容类型:应用程序/json\r\n”
L“应用程序id:7ty44\r\n”
L“应用程序密钥:e36ff19de5623\r\n”// 来自与“S Andrew”的讨论,这是一个Win32控制台应用程序,使用旧免费软件中使用的包装器函数,使用WinHTTP测试GET/POST

通过站点测试的请求

#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“Winhttp”)
#包括//SHRegGetValue
#pragma注释(lib,“Shlwapi”)
#定义HTTP_超时
HINTERNET hOpen,hOpenProxy;
void GetProxy(WCHAR*sProxyName);
DWORD WinHTTPRequest(LPCTSTR pServerName、LPCTSTR pRequest、WCHAR*sCommand、LPVOID pPostData、int-nPostDataLength、LPCWSTR pwszHeaders、char**dataOut、int*nRead、WCHAR**dataHeaderOut、BOOL bTestProxy、BOOL bSecure、WCHAR*wsRedirect、DWORD*dwReturnStatus);
WCHAR g_wsCurrentProxy[255]=L“”;
int main()
{
hOpen=WinHttpOpen(L“测试”,WINHTTP\u访问类型\u默认代理,WINHTTP\u无代理\u名称,WINHTTP\u无代理\u旁路,0);
WinHttpSetTimeout(hOpen、HTTP\u超时、HTTP\u超时、HTTP\u超时、HTTP\u超时);
WCHAR wsHostName[MAX_PATH]=L“www.dummy.restapiexample.com”;
WCHAR wsURLPathGet[MAX_PATH]=L“/api/v1/employees”;
WCHAR wsURLPathPost[MAX_PATH]=L“/api/v1/create”;
char sPostData[500]=“{\“name\”:“Test Unique name 1\”,“salary\”:“123456\”,“age\”:“18\”;
char*sHTTPData=NULL;
int-d=0;
WCHAR*wsDataHeader=NULL;
WCHAR wsRedirect[2048+32+3];//互联网最大URL长度
DWORD dwStatus=0;
WCHAR wsAdditionalHeaders[1024]=L”“;
lstrcpy(wsAdditionalHeaders,
L“接受:应用程序/json\r\n”
L“内容类型:应用程序/x-www-form-urlencoded\r\n”
//接受
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>

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

#include <Shlwapi.h> // SHRegGetValue
#pragma comment(lib, "Shlwapi")

#define HTTP_TIMEOUT 15000
HINTERNET hOpen, hOpenProxy;
void GetProxy(WCHAR* sProxyName);
DWORD WinHTTPRequest(LPCTSTR pServerName, LPCTSTR pRequest, WCHAR* sCommand, LPVOID pPostData, int nPostDataLength, LPCWSTR pwszHeaders, char **dataOut, int *nRead, WCHAR **dataHeaderOut, BOOL bTestProxy, BOOL bSecure, WCHAR* wsRedirect, DWORD *dwReturnStatus);
WCHAR g_wsCurrentProxy[255] = L"";

int main()
{
    hOpen = WinHttpOpen(L"Test", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME,  WINHTTP_NO_PROXY_BYPASS, 0);
    WinHttpSetTimeouts(hOpen, HTTP_TIMEOUT, HTTP_TIMEOUT, HTTP_TIMEOUT, HTTP_TIMEOUT);

    WCHAR wsHostName[MAX_PATH] = L"www.dummy.restapiexample.com";
    WCHAR wsURLPathGet[MAX_PATH] = L"/api/v1/employees";
    WCHAR wsURLPathPost[MAX_PATH] = L"/api/v1/create";
    char sPostData[500] = "{\"name\":\"Test Unique Name 1\",\"salary\":\"123456\",\"age\":\"18\"}";

    char *sHTTPData = NULL;
    int nDataRead = 0;
    WCHAR *wsDataHeader = NULL;
    WCHAR wsRedirect[2048 + 32 + 3]; // INTERNET_MAX_URL_LENGTH
    DWORD dwStatus = 0;

    WCHAR wsAdditionalHeaders[1024] = L"";
    lstrcpy(wsAdditionalHeaders,
        L"Accept: application/json\r\n"
        L"Content-Type: application/x-www-form-urlencoded\r\n"
        //L"Accept-Encoding: gzip, deflate, br\r\n");
        L"Accept-Encoding: txt\r\n");

    printf("Before first GET - Type a key\n");
    _getch();
    DWORD dwReturn = WinHTTPRequest(wsHostName, wsURLPathGet, L"GET", WINHTTP_NO_REQUEST_DATA, NULL, wsAdditionalHeaders, &sHTTPData, &nDataRead, &wsDataHeader, 0, 0, wsRedirect, &dwStatus);
    if (dwStatus == 0)
        printf(sHTTPData);
    else
        printf("Error Status : [%d]\n", dwStatus);
    if (sHTTPData)
        delete[] sHTTPData;
    if (wsDataHeader)
        delete[] wsDataHeader;

    printf("\n\nBefore POST - Type a key\n");
    _getch();
    dwReturn = WinHTTPRequest(wsHostName, wsURLPathPost, L"POST", sPostData, NULL, wsAdditionalHeaders, &sHTTPData, &nDataRead, &wsDataHeader, 0, 0, wsRedirect, &dwStatus);
    if (dwStatus == 0)
        printf(sHTTPData);
    else
        printf("Error Status : [%d]\n", dwStatus);
    if (sHTTPData)
        delete[] sHTTPData;
    if (wsDataHeader)
        delete[] wsDataHeader;

    printf("\n\nBefore second GET - Type a key\n");
    _getch();
    dwReturn = WinHTTPRequest(wsHostName, wsURLPathGet, L"GET", WINHTTP_NO_REQUEST_DATA, NULL, wsAdditionalHeaders, &sHTTPData, &nDataRead, &wsDataHeader, 0, 0, wsRedirect, &dwStatus);
    if (dwStatus == 0)
        printf(sHTTPData);
    else
        printf("Error Status : [%d]\n", dwStatus);
    if (sHTTPData)
        delete[] sHTTPData;
    if (wsDataHeader)
        delete[] wsDataHeader;

    printf("\n\nEND - Type a key\n");
    _getch();
    if (hOpen)
        WinHttpCloseHandle(hOpen);
    if (hOpenProxy)
        WinHttpCloseHandle(hOpenProxy);
    return 0;
}

void GetProxy(WCHAR* sProxyName)
{
    lstrcpy(sProxyName, L"");
    unsigned long nBufferSize = 4096;
    WCHAR wszBuf[4096] = { 0 };
    WINHTTP_PROXY_INFO* pInfo = (WINHTTP_PROXY_INFO*)wszBuf;
    if (WinHttpQueryOption(NULL, WINHTTP_OPTION_PROXY, pInfo, &nBufferSize))
    {
        if (pInfo->dwAccessType == WINHTTP_OPTION_PROXY)
        {
            WCHAR wsKey[MAX_PATH] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
            WCHAR wsValue[MAX_PATH] = L"ProxyEnable";
            DWORD dwValue = (DWORD)FALSE;
            DWORD dwSize = sizeof(dwValue);
            LONG nStatus = SHRegGetValue(HKEY_CURRENT_USER, wsKey, wsValue, SRRF_RT_DWORD, NULL, &dwValue, &dwSize);            
            if ((nStatus == ERROR_FILE_NOT_FOUND) || (nStatus == ERROR_PATH_NOT_FOUND))
                nStatus = SHRegGetValue(HKEY_LOCAL_MACHINE, wsKey, wsValue, SRRF_RT_DWORD, NULL, &dwValue, &dwSize);
            if (nStatus != ERROR_SUCCESS)
                dwValue = FALSE;
            if (dwValue)
                lstrcpy(sProxyName, pInfo->lpszProxy);
        }
    }
}

DWORD WinHTTPRequest(LPCTSTR pServerName, LPCTSTR pRequest, WCHAR* sCommand, LPVOID pPostData, int nPostDataLength, LPCWSTR pwszHeaders, char **dataOut, int *nRead, WCHAR **dataHeaderOut, BOOL bTestProxy, BOOL bSecure, WCHAR* wsRedirect, DWORD *dwReturnStatus)
{
    HINTERNET hCurrentOpen = NULL;
    if (bTestProxy)
    {
        WCHAR sProxy[255] = L"";
        GetProxy(sProxy);
        if (lstrcmp(sProxy, L"") == 0)
            hCurrentOpen = hOpen;
        else if (lstrcmp(sProxy, g_wsCurrentProxy) != 0)
        {
            if (hOpenProxy)
                WinHttpCloseHandle(hOpenProxy);
            hOpenProxy = WinHttpOpen(L"Test", WINHTTP_ACCESS_TYPE_NAMED_PROXY, sProxy, NULL, 0/*INTERNET_FLAG_ASYNC*/);
            lstrcpy(g_wsCurrentProxy, sProxy);
            hCurrentOpen = hOpenProxy;
        }
        else
            hCurrentOpen = hOpenProxy;
    }
    else
        hCurrentOpen = hOpen;

    HINTERNET hConnect = NULL;
    if (bSecure)
        hConnect = WinHttpConnect(hCurrentOpen, pServerName, INTERNET_DEFAULT_HTTPS_PORT, 0);
    else
        hConnect = WinHttpConnect(hCurrentOpen, pServerName, INTERNET_DEFAULT_HTTP_PORT, 0);

    if (!hConnect)
    {
        DWORD dwError = GetLastError();
        return dwError;
    }

    DWORD dwFlags;
    if (bSecure)
        dwFlags = WINHTTP_FLAG_SECURE | WINHTTP_FLAG_REFRESH;
    else
        dwFlags = WINHTTP_FLAG_REFRESH; 

    HINTERNET hRequest = WinHttpOpenRequest(hConnect, sCommand, pRequest, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, dwFlags);
    if (!hRequest)
    {
        DWORD dwError = GetLastError();
        WinHttpCloseHandle(hConnect);
        return dwError;
    }

    WinHttpAddRequestHeaders(hRequest, pwszHeaders, -1, WINHTTP_ADDREQ_FLAG_ADD);
    int nLengthPostData;
    if (nPostDataLength == NULL)
    {
        if (pPostData)
            nLengthPostData = strlen((char*)pPostData);
        else
            nLengthPostData = 0;
    }
    else
        nLengthPostData = nPostDataLength;

    BOOL bSuccess;
    if (wsRedirect != NULL)
    {
        DWORD dwOption;
        DWORD dwOptionSize;
        dwOption = WINHTTP_OPTION_REDIRECT_POLICY_NEVER;
        dwOptionSize = sizeof(DWORD);
        bSuccess = WinHttpSetOption(hRequest, WINHTTP_OPTION_REDIRECT_POLICY, (LPVOID)&dwOption, dwOptionSize);
        DWORD dwOptionValue = WINHTTP_DISABLE_REDIRECTS;
        bSuccess = WinHttpSetOption(hRequest, WINHTTP_OPTION_DISABLE_FEATURE, &dwOptionValue, sizeof(dwOptionValue));
    }   
    BOOL b = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, pPostData, pPostData == NULL ? 0 : nLengthPostData, nLengthPostData, 0 );
    if (!b)
    {
        DWORD dwError = GetLastError();
        WinHttpCloseHandle(hConnect);
        WinHttpCloseHandle(hRequest);
        return dwError;
    }
    WinHttpReceiveResponse( hRequest, NULL);
    DWORD dwStatus = 0;
    DWORD dwStatusSize = sizeof(DWORD);
    if (WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatus, &dwStatusSize, NULL))
    {
        if (HTTP_STATUS_REDIRECT == dwStatus || HTTP_STATUS_MOVED == dwStatus)
        {
            DWORD dwSize;
            WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_LOCATION, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX);
            if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
                return 500;
            LPWSTR pwsRedirectURL = new WCHAR[dwSize];
            bSuccess = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_LOCATION, WINHTTP_HEADER_NAME_BY_INDEX, pwsRedirectURL, &dwSize, WINHTTP_NO_HEADER_INDEX);
            if (!bSuccess)
                return 500;
            if (wsRedirect != NULL)
                lstrcpy(wsRedirect, pwsRedirectURL);
            if (dwReturnStatus != NULL)
                *dwReturnStatus = dwStatus;
            delete[] pwsRedirectURL;
        }
        else if (dwStatus != HTTP_STATUS_OK && dwStatus != HTTP_STATUS_BAD_REQUEST && dwStatus != HTTP_STATUS_CREATED)
        {
            DWORD dwError = GetLastError();
            WinHttpCloseHandle(hConnect);
            WinHttpCloseHandle(hRequest);
            if (dwReturnStatus != NULL)
                *dwReturnStatus = dwStatus;
            return dwError;
        }
    }
    if (dataHeaderOut != NULL)
    {
        DWORD dwSize = 0;
        WCHAR *pOutBuffer = NULL;
        if (!WinHttpQueryHeaders(hRequest,WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX))
        {
            DWORD dwErr = GetLastError();
            if (dwErr != ERROR_INSUFFICIENT_BUFFER)
            {
                DWORD dwError = GetLastError();
                WinHttpCloseHandle(hConnect);
                WinHttpCloseHandle(hRequest);
                return dwError;
            }
        }
        pOutBuffer = new WCHAR[dwSize];
        if (WinHttpQueryHeaders(hRequest,WINHTTP_QUERY_RAW_HEADERS_CRLF,WINHTTP_HEADER_NAME_BY_INDEX, pOutBuffer, &dwSize, WINHTTP_NO_HEADER_INDEX))
        {
            pOutBuffer[dwSize] = '\0';
            *dataHeaderOut = (WCHAR*)pOutBuffer;
        }       
        //delete[] pOutBuffer;
    }

    char *sReadBuffer = NULL;
    DWORD nTotalRead = 0;
    DWORD nToRead = 0;
    DWORD nBytesRead = 0;
    do {
        if (!WinHttpQueryDataAvailable(hRequest, &nToRead))
            break;
        if (nToRead == 0)
            break;
        sReadBuffer = (char*)((sReadBuffer == NULL) ? malloc(nToRead) : realloc(sReadBuffer, nTotalRead + nToRead + 1));
        if (WinHttpReadData(hRequest, sReadBuffer + nTotalRead, nToRead, &nBytesRead))
        {
            nTotalRead += nBytesRead;
        }
    } while (nToRead > 0);
    if (sReadBuffer != NULL && nTotalRead > 0)
    {
        {
            char *sBuffer = new char[nTotalRead + 1];
            memcpy(sBuffer, sReadBuffer, nTotalRead + 1);
            sBuffer[nTotalRead] = '\0';
            *dataOut = sBuffer;
        }
        free(sReadBuffer);
    }

    *nRead = nTotalRead;
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hRequest);
    return ERROR_SUCCESS;
}