最近在用MFC實作一段wifi升級,供應商那邊提供的升級是網頁升級,我想要整合到MFC程勛里,在模仿http請求的時候,遇到發送升級檔案的時候,發現和之前get post不一樣(如下圖)
,如何才能實作這個http請求呢?prequest payload的資訊到底應該添加在哪?由于本人不怎么了解http以及底層通訊,所以請大家不吝賜教....萬分感激...
uj5u.com熱心網友回復:
可以看看curl庫uj5u.com熱心網友回復:
http://blog.csdn.net/a956602523/article/details/50956530 參考下uj5u.com熱心網友回復:
把檔案放到post的payload中uj5u.com熱心網友回復:
上傳檔案Content- Type使用multipart/form-data格式。平時post一般不使用這個。你可以看看http協議。
http://blog.csdn.net/xiaojianpitt/article/details/6856536
不過如果兩邊有特殊規定,也可以不使用這種格式。之前我自己寫的httpserver就沒用這種格式。
uj5u.com熱心網友回復:
這個prequest payload的值在注冊表中的位置是 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent。
HRESULT PostRequestDataToAppServer(LPWSTR lpwServerUrl,
char *pszRequestData,
BYTE **ppbyResponseData,
DWORD &dwResponseDataSize,
DWORD dwTimeOut)
{
TRACE_FN_SCOPE;
HRESULT hResult = E_FAIL;
BOOL bRetCode = FALSE;
LPWSTR lpwUserAgent = NULL;
std::wstring wstrHostName = L"";
std::wstring wstrObjectName = L"";
DWORD dwServerPort = 80;
BOOL bSSLConnect = FALSE;
HINTERNET hInternet = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;
DWORD dwSecureFlags = INTERNET_FLAG_RELOAD;
DWORD dwQueryFlags = 0;
DWORD dwFlagsSize = sizeof(dwQueryFlags);
WCHAR wszStatusCode[16] = { 0 };
DWORD dwStatusCodeSize = _countof(wszStatusCode);
LPBYTE lpReturnBuffer = NULL;
LPBYTE lpReturnBufferNewStart = NULL;
DWORD dwNumberOfBytesAvailable = 0;
DWORD dwBytesOfRead = 0;
WCHAR *wszAccept[] = {L"application/json", L"text/javascript", L"*/*", NULL};
struct
{
wchar_t* ContentType;
}Headers = { L"Content-Type:application/x-www-form-urlencoded" /*L"Content-Type:application/json;charset=UTF-8"*/ };
ERROR_ESCAPE(lpwServerUrl == NULL || pszRequestData == 0, ERROR_INVALID_PARAMETER, L"Check Parameter");//自己寫的一個宏,意思就是第一個引數是TRUE的話,跳轉到goto,FALSE的話,就繼續往下走
hResult = ReadRegistryData(HKEY_CURRENT_USER,
REG_USERAGENT_SUBKEY,
REG_USERAGENT_VALUENAME,
(LPVOID *)&lpwUserAgent,
NULL); //讀取注冊表的鍵值,這個函式代碼我就不一一列舉了,意思明白就成
ERROR_ESCAPE(hResult != S_OK, hResult, L"ReadRegistryData");
hResult = ParseNetworkURL(lpwServerUrl,
wstrHostName,
wstrObjectName,
dwServerPort,
bSSLConnect);//將URL拆解,internet開頭的這套函式有現成的函式,我還是自己封了一個
ERROR_ESCAPE(hResult != S_OK, hResult, L"ParseNetworkURL");
if (bSSLConnect == TRUE)
{
dwSecureFlags = INTERNET_FLAG_SECURE |
INTERNET_FLAG_RELOAD |
SECURITY_INTERNET_MASK |
SECURITY_IGNORE_ERROR_MASK;
}
else
{
dwSecureFlags = INTERNET_FLAG_RELOAD;
}
hInternet = ::InternetOpenW(lpwUserAgent,
INTERNET_OPEN_TYPE_DIRECT,
NULL,
NULL,
0);
ERROR_ESCAPE(hInternet == NULL, 0, L"InternetOpenW");
hConnect = ::InternetConnectW(hInternet,
wstrHostName.c_str(),
(INTERNET_PORT)dwServerPort,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
0);
ERROR_ESCAPE(hConnect == NULL, 0, L"InternetConnect");
if (dwTimeOut != INFINITE)
{
bRetCode = ::InternetSetOptionW(hConnect,
INTERNET_OPTION_CONNECT_TIMEOUT,
(LPVOID)&dwTimeOut,
sizeof(dwTimeOut));
TRACE(INFO, L"InternetSetOptionW result: %d", bRetCode);
}
hRequest = ::HttpOpenRequestW(hConnect,
L"POST",
wstrObjectName.c_str(),
NULL,
NULL,
(LPCWSTR*)wszAccept,
dwSecureFlags,
0);
ERROR_ESCAPE(hRequest == NULL, 0, L"HttpOpenRequest");
if (bSSLConnect == TRUE)
{
bRetCode = ::InternetQueryOptionW(hRequest,
INTERNET_OPTION_SECURITY_FLAGS,
(LPVOID)&dwQueryFlags,
&dwFlagsSize);
TRACE(INFO, L"InternetQueryOptionW result: %d", bRetCode);
dwQueryFlags |= SECURITY_FLAG_IGNORE_REVOCATION;
bRetCode = ::InternetSetOptionW(hRequest,
INTERNET_OPTION_SECURITY_FLAGS,
(LPVOID)&dwQueryFlags,
sizeof(dwQueryFlags));
TRACE(INFO, L"InternetSetOptionW result: %d", bRetCode);
}
bRetCode = ::HttpAddRequestHeadersW(hRequest,
Headers.ContentType,
wcslen(Headers.ContentType),
HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);
ERROR_ESCAPE(bRetCode == FALSE, 0, L"HttpAddRequestHeaders");
bRetCode = ::HttpSendRequestW(hRequest,
NULL,
-1,
(LPVOID)pszRequestData,
strlen(pszRequestData));
ERROR_ESCAPE(bRetCode == FALSE, 0, L"HttpSendRequest");
bRetCode = ::HttpQueryInfoW(hRequest,
HTTP_QUERY_STATUS_CODE,
wszStatusCode,
&dwStatusCodeSize,
NULL);
ERROR_ESCAPE(bRetCode == FALSE, 0, L"HttpQueryInfo");
TRACE(INFO, L"wszStatusCode: [%d]", _wtoi(wszStatusCode));
TRACE(INFO, L"Status code: %d", _wtoi(wszStatusCode));
ERROR_ESCAPE(_wtoi(wszStatusCode) != 200, ERROR_NOT_FOUND, L"Object not found");
dwStatusCodeSize = sizeof(wszStatusCode);
memset(wszStatusCode, 0, sizeof(wszStatusCode));
bRetCode = ::HttpQueryInfoW(hRequest, HTTP_QUERY_CONTENT_LENGTH, wszStatusCode, &dwStatusCodeSize, NULL);
ERROR_ESCAPE(bRetCode == FALSE, 0, L"HttpQueryInfoW(Length)");
dwResponseDataSize = _wtol(wszStatusCode);
ALLOCATE_BUFFER(lpReturnBuffer, BYTE, dwResponseDataSize + 1);
lpReturnBufferNewStart = lpReturnBuffer;
do
{
bRetCode = ::InternetQueryDataAvailable(hRequest,
&dwNumberOfBytesAvailable,
0,
0);
ERROR_ESCAPE(bRetCode == FALSE, 0, L"InternetQueryDataAvailable");
TRACE(INFO, L"Available data size: %lu", dwNumberOfBytesAvailable);
if (dwNumberOfBytesAvailable == 0)
{
TRACE(INFO, L"Download complete");
break;
}
bRetCode = ::InternetReadFile(hRequest,
lpReturnBufferNewStart,
min(dwNumberOfBytesAvailable, BUFFER_SIZE),
&dwBytesOfRead);
TRACE(INFO, L"Read size: %lu", dwBytesOfRead);
ERROR_ESCAPE(bRetCode == FALSE, 0, L"InternetReadFile");
lpReturnBufferNewStart += dwBytesOfRead;
} while (dwBytesOfRead != 0);
*ppbyResponseData = lpReturnBuffer;
lpReturnBuffer = NULL;
TRACE(INFO, L"dwResponseDataSize: [%lu]", dwResponseDataSize);
hResult = S_OK;
_err:
lpReturnBufferNewStart = NULL;
DELETE_BUFFER(lpwUserAgent);
DELETE_BUFFER(lpReturnBuffer);
INTERNET_CLOSE_HANDLE(hInternet);
INTERNET_CLOSE_HANDLE(hConnect);
INTERNET_CLOSE_HANDLE(hRequest);
return hResult;
}
uj5u.com熱心網友回復:
這樣的例子應該很多,使用最基礎的Internetconnection應該也可以吧。。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/123955.html
標籤:界面
