zoukankan      html  css  js  c++  java
  • 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("
    %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("
    %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 }
    
    
    
  • 相关阅读:
    对象存储、块存储、文件系统存储概念与区别
    一款线程安全、基本功能齐全的STL
    Libevent源码分析—event_base_dispatch()
    Libevent源码分析—event_add()
    Libevent源码分析—从使用Libevent库开始
    Libevent源码分析—event_set()
    Libevent源码分析—event_init()
    利用Elasticsearch搭建全球域名解析记录
    Mysql Order By注入总结
    解决在ubuntu下requests 无法找到模块packages
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/3833967.html
Copyright © 2011-2022 走看看