HttpSendRequest向服务端发送数据,构造请求http头

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介:
可以参考这篇文章:  使用 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 ,如需转载请自行联系原作者


相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
1天前
|
缓存 应用服务中间件 Apache
HTTP 范围Range请求
HTTP范围请求是一种强大的技术,允许客户端请求资源的部分内容,提高了传输效率和用户体验。通过正确配置服务器和实现范围请求,可以在视频流、断点续传下载等场景中发挥重要作用。希望本文提供的详细介绍和示例代码能帮助您更好地理解和应用这一技术。
37 19
|
28天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
84 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
9天前
|
JSON JavaScript 前端开发
什么是HTTP POST请求?初学者指南与示范
HTTP POST请求是一种常用的HTTP方法,主要用于向服务器发送数据。通过合理设置请求头和请求主体,可以实现数据的可靠传输。无论是在客户端使用JavaScript,还是在服务器端使用Node.js,理解和掌握POST请求的工作原理和应用场景,对于Web开发至关重要。
122 18
|
9天前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
51 2
|
27天前
|
Web App开发 大数据 应用服务中间件
什么是 HTTP Range请求(范围请求)
HTTP Range 请求是一种非常有用的 HTTP 功能,允许客户端请求资源的特定部分,从而提高传输效率和用户体验。通过合理使用 Range 请求,可以实现断点续传、视频流播放和按需加载等功能。了解并掌握 HTTP Range 请求的工作原理和应用场景,对开发高效的网络应用至关重要。
63 15
|
30天前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
42 3
|
27天前
|
Web App开发 网络安全 数据安全/隐私保护
Lua中实现HTTP请求的User-Agent自定义
Lua中实现HTTP请求的User-Agent自定义
|
存储 Web App开发 监控
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
我们以前使用过的对hbase和hdfs进行健康检查,及剩余hdfs容量告警,简单易用 1.针对hadoop2的脚本: #/bin/bashbin=`dirname $0`bin=`cd $bin;pwd`STATE_OK=...
1060 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
异步通信 对于BS(Browser-Server 浏览器)架构,很多情景下server的处理时间较长。 如果浏览器发送请求后,保持跟server的连接,等待server响应,那么一方面会对用户的体验有负面影响; 另一方面,很有可能会由于超时,提示用户服务请求失败。
775 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Datanode的日志中看到: 10/12/14 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.
698 0