HttpSendRequest向服務端傳送資料,構造請求http頭

weixin_33858249發表於2017-11-15
可以參考這篇文章: 使用 WinInte API 傳送 HTTP 請求,不過在我的測試中發現是錯誤的. 

  1. //向http://192.168.8.72:8080/oss/client/analysis.g傳送資料.   
  2.    
  3. LPCTSTR lpURL = _T("http://192.168.8.72:8080");   
  4. if (!::InternetCheckConnection(lpURL, FLAG_ICC_FORCE_CONNECTION, 0))   
  5.     return;   
  6.        
  7. HINTERNET hOpen = ::InternetOpen(_T("client.exe"), INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);   
  8. if (NULL == hOpen)   
  9.     return;   
  10.        
  11. LPCTSTR lpDomainName = _T("192.168.8.72"); // 注意不能帶 http://   
  12. // 該函式第3個引數不能是80,而應該是8080   
  13. HINTERNET hConnect = ::InternetConnect(hOpen, lpDomainName, 8080, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);   
  14. if (NULL == hConnect)   
  15.     goto FUN_END2;   
  16.    
  17. // 注意第3個引數的個數,最前面要有"/",它同lpURL拼接成http://192.168.8.72:8080/oss/client/analysis.g   
  18. LPCTSTR szAccept[] = {_T("*/*"), NULL};   
  19. DWORD dwFlag = INTERNET_FLAG_NO_CACHE_WRITE;   
  20. HINTERNET hOpenRequest = ::HttpOpenRequest(hConnect, _T("POST"), _T("/oss/client/analysis.g"),    
  21.     _T("HTTP/1.1"), lpURL, szAccept, dwFlag, 0);   
  22. if (NULL == hOpenRequest)   
  23.     goto FUN_END1;   
  24.        
  25. BOOL bRet;   
  26.    
  27. TCHAR szPostData[] = _T("<Root>this is test data from client</Root>");   
  28. char utf8PostData[BUF_LEN] = {0};   
  29. strcpy(utf8PostData, dataConvert.TCharToUTF8(szPostData));   
  30.        
  31.    
  32. // 外發的header.   
  33. // 注意,這裡的頭部很容易錯.   
  34. // 每個字串結尾不能帶諸如 "/r/n","\r\n"這樣的結尾,最後一個字串必須要帶兩個"\r\n",也就是"\r\n\r\n".   
  35. // 有些網友寫的示例中,每個字串後都帶有諸如 "/r/n"或"\r\n"這樣的結尾,但在我的測試中發現是錯誤的,   
  36. // HttpQueryInfo返回的狀態碼總是400,意思是"錯誤請求 — 請求中有語法問題,或不能滿足請求",估計這跟   
  37. // 具體的web服務有關.但有個簡單的方式處理該問題,可使用chrome瀏覽器訪問某個url(這裡是http://192.168.8.72:8080/oss/client/// analysis.g),然後使用抓包工具Wireshark抓取http包,分析request和response頭.然後再使用你的程式請求你的url,一樣抓包,然後對// 比這兩次抓取的資料包中http頭有什麼區別,修改你的程式碼,不斷嘗試,直到成功.   
  38. TCHAR headerLanguage[] = _T("Accept-Language: zh-CN,zh;q=0.8");   
  39. TCHAR headerEncoding[] = _T("Accept-Encoding: gzip,deflate,sdch";);   
  40. TCHAR headerCharset[] = _T("Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3");   
  41. TCHAR headerContentType[] = _T("Content-Type: text/xml";);   
  42. TCHAR headerHost[] = _T("Host: 192.168.8.72:8080";);   
  43. TCHAR headerOrigin[] = _T("Origin: http://192.168.8.72:8080";);   
  44. TCHAR headerReferer[] = _T("Referer: http://192.168.8.72:8080/oss/client/create.g");   
  45. TCHAR headerContentLength[64];   
  46. _stprintf(headerContentLength, _T("Content-Length: %d\r\n\r\n"), strlen(utf8PostData)); //注意結尾有兩個\r\n   
  47.    
  48. // 新增header 資訊   
  49. bRet = HttpAddRequestHeaders(hOpenRequest, headerLanguage,    -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
  50. bRet = HttpAddRequestHeaders(hOpenRequest, headerEncoding,    -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
  51. bRet = HttpAddRequestHeaders(hOpenRequest, headerCharset,    -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
  52. bRet = HttpAddRequestHeaders(hOpenRequest, headerContentType, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
  53. bRet = HttpAddRequestHeaders(hOpenRequest, headerHost, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
  54. bRet = HttpAddRequestHeaders(hOpenRequest, headerOrigin, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
  55. bRet = HttpAddRequestHeaders(hOpenRequest, headerReferer, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
  56. bRet = HttpAddRequestHeaders(hOpenRequest, headerContentLength, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
  57.    
  58. bRet = ::HttpSendRequest(hOpenRequest, NULL, 0, utf8PostData, strlen(utf8PostData));   
  59. DWORD dwErr = ::GetLastError();   
  60. if (!bRet)  goto FUN_END1;   
  61.    
  62. TCHAR szBuff[BUF_LEN] = {0};   
  63. DWORD dwBuffSize = BUF_LEN*sizeof(szBuff);   
  64. bRet = ::HttpQueryInfo(hOpenRequest, HTTP_QUERY_STATUS_CODE, (LPVOID)szBuff, &dwBuffSize, NULL);   
  65.    
  66. //Reference to http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html   
  67. int nStatusCode = _tstoi(szBuff);   
  68. if (nStatusCode<200 || 206<nStatusCode)   
  69.     bRet = FALSE;   
  70.        
  71. if (bRet)   
  72. {   
  73.     TCHAR szBuff[BUF_LEN_1024+1] = {0};   
  74.     DWORD dwBuffSize = BUF_LEN_1024*sizeof(szBuff);   
  75.     bRet = ::HttpQueryInfo(hOpenRequest, HTTP_QUERY_CONTENT_LENGTH, (LPVOID)szBuff, &dwBuffSize, NULL);   
  76.    
  77.     memset(szBuff, 0, sizeof(szBuff));   
  78.     dwBuffSize = BUF_LEN_1024*sizeof(szBuff);   
  79.     bRet = ::HttpQueryInfo(hOpenRequest, HTTP_QUERY_DATE, (LPVOID)szBuff, &dwBuffSize, NULL);   
  80.    
  81.     memset(szBuff, 0, sizeof(szBuff));   
  82.     dwBuffSize = BUF_LEN_1024*sizeof(szBuff);   
  83.     bRet = ::HttpQueryInfo(hOpenRequest, HTTP_QUERY_SERVER, (LPVOID)szBuff, &dwBuffSize, NULL);   
  84.    
  85.     memset(szBuff, 0, sizeof(szBuff));   
  86.     dwBuffSize = BUF_LEN_1024*sizeof(szBuff);   
  87.     bRet = ::InternetReadFile(hOpenRequest, szBuff, dwBuffSize, &dwBuffSize);   
  88.     if (bRet)   
  89.     {   
  90.         // ...   
  91.     }   
  92. }   
  93. InternetCloseHandle(hOpenRequest);
  94.  
  95. FUN_END1:   
  96. ::InternetCloseHandle(hConnect);   
  97.    
  98. FUN_END2:   
  99. ::InternetCloseHandle(hOpen);  

 














本文轉自jetyi51CTO部落格,原文連結:http://blog.51cto.com/jetyi/1019642 ,如需轉載請自行聯絡原作者


相關文章