VS2008 C++ 利用WinHttp API获取Http请求/响应头部Header

http://www.cnblogs.com/LCCRNblog/p/3833472.html

这一篇博客中,实现了获取http请求/响应后的html源码,现在需要获取http请求/响应的头部Header。。通过对WinHttp Api的查看,现给出实现代码。。

  1 // WinHttpTest.cpp : 定义控制台应用程序的入口点。
  2 //
  3 //#include <stdafx.h>
  4 #include <vector>
  5 #include <winsock2.h>
  6 #include <Winhttp.h>
  7 //#include <urlmon.h>
  8 #include <windows.h>
  9 #include <iostream>
 10 #include <fstream>
 11 #include <string>
 12 #include "AtlBase.h"
 13 #include "AtlConv.h"
 14 using namespace std;
 15 #pragma comment(lib, "winhttp")//这一句不能省略
 16 string GetHost(string strUrl)
 17 {
 18    int indexHttp = strUrl.find("http://");
 19    if(indexHttp != -1)
 20    {
 21        strUrl = strUrl.substr(7);
 22    }
 23    else
 24        return "";
 25    int indexSlash = strUrl.find("/");
 26    if(indexSlash != -1)
 27    {
 28        return strUrl.substr(0, indexSlash);
 29    }
 30    else
 31        return strUrl;
 32    return "";
 33 }
 34 string GetRequestStr(string strUrl)
 35 {
 36    int indexHttp = strUrl.find("http://");
 37    if(indexHttp != -1)
 38    {
 39        strUrl = strUrl.substr(7);
 40    }
 41    else
 42        return "";
 43    int indexSlash = strUrl.find("/");
 44    if(indexSlash == -1)
 45    {
 46        return "";
 47    }
 48    else
 49        return strUrl.substr(indexSlash);
 50 }
 51 void GetHtml(string strUrl)
 52 {
 53    string strHost = GetHost(strUrl);//获取Host
 54    string strRequestStr = GetRequestStr(strUrl);//获取请求路径
 55    USES_CONVERSION;
 56     //2014年7月9日10:02:29
 57     //LPCWSTR的定义 typedef const wchar_t* LPCWSTR;
 58     //LPSTR的定义   typedef char* LPCWSTR;
 59     //LPWSTR的定义  typedef wchar_t* LPWSTR;
 60    LPCWSTR host = A2CW(strHost.c_str());//string转换为常量指针类型
 61    LPCWSTR requestStr = A2CW(strRequestStr.c_str());
 62    //Variables
 63    DWORD dwSize = 0;
 64    BOOL  bResults = FALSE;
 65
 66    //Note the definition of HINTERNET
 67    HINTERNET  hSession = NULL,
 68        hConnect = NULL,
 69        hRequest = NULL;
 70
 71    //2014年7月9日10:39:33
 72    //Search the WinHttp API
 73    //what to do when call the function WinHttpOpen?
 74    // Use WinHttpOpen to obtain a session handle.
 75    hSession = WinHttpOpen(L"WinHTTP Example/1.0",
 76        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
 77        WINHTTP_NO_PROXY_NAME,
 78        WINHTTP_NO_PROXY_BYPASS, 0);
 79  // Specify an HTTP server.
 80    if (hSession)
 81        hConnect = WinHttpConnect(hSession, host,
 82        INTERNET_DEFAULT_HTTP_PORT, 0);
 83  // Create an HTTP request handle.
 84    if (hConnect)
 85        hRequest = WinHttpOpenRequest(hConnect, L"GET", requestStr,
 86        NULL, WINHTTP_NO_REFERER,
 87        NULL,
 88        NULL);
 89  // Send a request.
 90    if (hRequest)
 91        bResults = WinHttpSendRequest(hRequest,
 92        WINHTTP_NO_ADDITIONAL_HEADERS,
 93        0, WINHTTP_NO_REQUEST_DATA, 0,
 94        0, 0);
 95 // End the request.
 96    if (bResults)
 97        bResults = WinHttpReceiveResponse(hRequest, NULL);
 98
 99 //2014年7月9日16:35:40
100 //获取请求Header
101      LPVOID lpOutBuffer = NULL;
102      int temp;
103      if (bResults)
104     {
105         //此处的参数与获取响应的Header参数不同
106         WinHttpQueryHeaders( hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF|WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
107                              WINHTTP_HEADER_NAME_BY_INDEX, NULL,
108                              &dwSize, WINHTTP_NO_HEADER_INDEX);
109
110         // Allocate memory for the buffer.
111         if( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
112         {
113             temp = dwSize/sizeof(WCHAR);
114             lpOutBuffer = new WCHAR[temp];
115
116             // Now, use WinHttpQueryHeaders to retrieve the header.
117             bResults = WinHttpQueryHeaders( hRequest,
118                                        WINHTTP_QUERY_RAW_HEADERS_CRLF|WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
119                                        WINHTTP_HEADER_NAME_BY_INDEX,
120                                        lpOutBuffer, &dwSize,
121                                        WINHTTP_NO_HEADER_INDEX);
122         }
123
124
125     }
126     //两种输出方式。。输出header,此处cout行不通
127     wcout<<(WCHAR*)lpOutBuffer;
128     if (bResults)
129        printf("\n%S",lpOutBuffer);
130
131     delete [] lpOutBuffer;
132
133  //2014年7月9日14:43:20 获取响应头部
134      if (bResults)
135     {
136         WinHttpQueryHeaders( hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF,
137                              WINHTTP_HEADER_NAME_BY_INDEX, NULL,
138                              &dwSize, WINHTTP_NO_HEADER_INDEX);
139
140         // Allocate memory for the buffer.
141         if( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
142         {
143             temp = dwSize/sizeof(WCHAR);
144             lpOutBuffer = new WCHAR[temp];
145
146             // Now, use WinHttpQueryHeaders to retrieve the header.
147             bResults = WinHttpQueryHeaders( hRequest,
148                                        WINHTTP_QUERY_RAW_HEADERS_CRLF,
149                                        WINHTTP_HEADER_NAME_BY_INDEX,
150                                        lpOutBuffer, &dwSize,
151                                        WINHTTP_NO_HEADER_INDEX);
152         }
153
154
155     }
156     //两种输出方式。。输出header,此处cout行不通
157     wcout<<(WCHAR*)lpOutBuffer;
158     if (bResults)
159        printf("\n%S",lpOutBuffer);
160
161     delete [] lpOutBuffer;
162 }
163 int _tmain(int argc, _TCHAR* argv[])
164 {
165
166    GetHtml("http://bbs.bccn.net/thread-294526-1-1.html");
167    system("pause");
168    return 0;
169 }

VS2008 C++ 利用WinHttp API获取Http请求/响应头部Header

时间: 2024-10-12 20:13:26

VS2008 C++ 利用WinHttp API获取Http请求/响应头部Header的相关文章

VS2008 C++ 利用WinHttp API获取任意Http网址的源码

最近一直在看有关Http的知识,对其基本的理论知识已经有所掌握,想通过一个C++具体的例子进行实际操作..于是上网查找了很多资料,发现在Windows系统上,可以通过WinHttp API接口开啊Http,于是仿照网上例子编写一个获取网页源码的C++程序.其中的代码基本是copy网友,主要是自己对代码的理解,并以此作为入门. 例子代码如下: 1 // WinHttpTest.cpp : 定义控制台应用程序的入口点. 2 // 3 //#include <stdafx.h> 4 #include

开源项目成熟度分析工具-利用github api获取代码库的信息

1.github api github api是http形式的api,功能还是比较丰富的,博主因为项目的原因主要用到的是提取project信息这项功能,返回的数据是JSON格式. api页:https://developer.github.com/v3/ Options: (H) means HTTP/HTTPS only, (F) means FTP only --anyauth Pick "any" authentication method (H) -a, --append Ap

LoadRunner 获取接口请求响应信息

Action() { int nHttpRetCode; // 默认最大长度为256,get请求需注意缓存问题,需要根据content-length进行修改 web_set_max_html_param_len("262144"); //自定义截取字符串,根据左右字符串获取数据,设置查找范围为消息体.左右查找边界为空则可以获取整个响应体的内容 web_reg_save_param("ResponseBody", "LB=", "RB=&

爬虫——python——百度地图经纬度查询——经纬度查看地点地名——利用百度API获取地名经纬度——爬取所有的中国地址

import requests address = '40.8587960,86.866991' url = 'http://api.map.baidu.com/geocoder?output=json&key=f247cdb592eb43ebac6ccd27f796e2d2&location=' + str(address) response = requests.get(url) answer = response.json() print('得到反解数据', answer) 使用py

利用Zabbix API 获取各个分组下的服务器列表以及详细信息

现在越来越多的公司选择使用开源软件Zabbix来做服务器业务监控,其高逼格的用户管理是个亮点,所以可以通过调用它的接口将权限管理应用到很多地方,比如说堡垒机权限.以下是用python简单写了个小脚本,通过定义分组名便可以得到分组下的服务器信息. #coding=utf-8 __author__ = 'Perling' from urllib import urlencode import urllib2 import json def post(post_data):     api_url =

perl利用DNSPOD API获取域名的各个地区的解析

#!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use JSON; use Encode; my $mail='user'; my $pass='pass'; my $domain_info_url='https://dnsapi.cn/Domain.Info'; my $record_list_url='https://dnsapi.cn/Record.List'; sub get_domain_id { ###获取数

wget/curl查看请求响应头信息

wget / curl 是两个比较方便的测试http功能的命令行工具,大多数情况下,测试http功能主要是查看请求响应 头信息 ,而给这两个工具加上适当的命令行参数即可轻易做到,其实查man手册就能找到对应的参数选项,不过这里仍然mark一下. wget --debug Turn on debug output, meaning various information important to the developers of Wget if it does not work properly

HTML5 利用百度地图API获取当前位置

由于项目需要定位到城市,研究了地理定位,做了一些手记,和大家分享一下~ 项目的开发需求是获取到当前用户的位置,然后为用户提供一些服务. 此时可以采用两种定位方式,一种是用GPS的定位,然后将定位到的经纬度传递到百度地图的API接口当中.另一种方法是利用百度API接口,使用IP地址定位,然后使用IP地址获取到的经纬度,传递到百度地图API接口中. 自己尝试使用了这两种方式进行定位.相对来说,IP地址定位,偏差比较大.GPS定位虽然还可以,但是也不足够精确.产生比较大偏差的原因有可能是以下几点造成的

利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)

利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)作者:Tuuzed(土仔)   发表于:2008年3月3日23:12:38 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明.http://www.cppblog.com/tuuzed/archive/2008/03/03/43631.html 可能很多人都知道NT系统的query user命令,命令返回“使用者名称 工作阶段名称 识别码 状态 闲置时间 登入时间”.如图