windows的http api分析

1、InternetCrackUrl解析:

BOOL WINAPI InternetCrackUrl(
  LPCTSTR lpszUrl, 
  DWORD dwUrlLength, 
  DWORD dwFlags, 
  LPURL_COMPONENTS lpUrlComponents
);

1)参数:(1)lpszUrl表示要解析的url,例如:http://www.123.com/456

(2)dwUrlLength表示上面要解析的url的长度。

(3)dwFlags表示标志位ICU_DECODE,ICU_ESCAPE

2)注释:一般来说,URL中可以存在用户名、密码、协议头、域名、路径等信息。InternetCrackUrl函数可以帮你分析出这些数据,所以它要求提供空间来保存它分析的数据。对于不需要的数据,传NULL就可以了。分析到的数据填充到URL_COMPONENTS结构体中。

3)使用举例(代码来源:Google breakpad):

  wchar_t scheme[16], host[256], path[256];
  URL_COMPONENTS components;
  memset(&components, 0, sizeof(components));
  components.dwStructSize = sizeof(components);
  components.lpszScheme = scheme;
  components.dwSchemeLength = sizeof(scheme) / sizeof(scheme[0]);
  components.lpszHostName = host;
  components.dwHostNameLength = sizeof(host) / sizeof(host[0]);
  components.lpszUrlPath = path;
  components.dwUrlPathLength = sizeof(path) / sizeof(path[0]);
  if (!InternetCrackUrl(url.c_str(), static_cast<DWORD>(url.size()),
                        0, &components)) {
    return false;
  }

解析:scheme,是http还是https;host,域名(如:www.123.com);path:路径(如:/456)。

 

2、InternetOpen解析:

HINTERNET WINAPI InternetOpen(
  LPCTSTR lpszAgent, 
  DWORD dwAccessType, 
  LPCTSTR lpszProxy, 
  LPCTSTR lpszProxyBypass, 
  DWORD dwFlags
);
1)参数:(1)lpszAgent,http协议中的Uesr-Agent字段(如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11)。

(2)dwAccess,InternetOpen的访问类型。(下面四个访问类型的解析来源:百度百科)INTERNET_OPEN_TYPE_DIRECT,使用直接连接网络;INTERNET_OPEN_TYPE_PRECONFIG,获取代理或直接从注册表中的配置,使用代理连接网络;INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,获取代理或直接从注册表中的配置,并防止启动Microsoft JScript或Internet设置(INS)文件的使用;INTERNET_OPEN_TYPE_PROXY,通过代理的请求,除非代理旁路列表中提供的名称解析绕过代理,在这种情况下,该功能的使用。

(3)lpszProxy,指针指向一个空结束的字符串,该字符串指定的代理服务器的名称,不要使用空字符串;如果dwAccessType未设置为INTERNET_OPEN_TYPE_PROXY,则此参数应该设置为NULL。(解析来着百度百科)

(4)lpszProxyBypass,指向一个空结束的字符串,该字符串指定的可选列表的主机名或IP地址。如果dwAccessType未设置为INTERNET_OPEN_TYPE_PROXY的 ,参数省略则为NULL。(解析来着百度百科)

(5)dwFlags,INTERNET_FLAG_ASYNC,使异步请求处理的后从这个函数返回的句柄。INTERNET_FLAG_FROM_CACHE,不进行网络请求,从缓存返回的所有实体,如果请求的项目不在缓存中,则返回一个合适的错误,如ERROR_FILE_NOT_FOUND。INTERNET_FLAG_OFFLINE,不进行网络请求,从缓存返回的所有实体,如果请求的项目不在缓存中,则返回一个合适的错误,如ERROR_FILE_NOT_FOUND。(解析来着百度百科)

2)解析:初始化一个应用程序,以使用 WinINet 函数。

3)举例(代码来源:Google breakpad):

static const wchar_t kUserAgent[] = L"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11";

AutoInternetHandle internet(InternetOpen(kUserAgent,
                                           INTERNET_OPEN_TYPE_PRECONFIG,
                                           NULL,  // proxy name
                                           NULL,  // proxy bypass
                                           0));   // flags
  if (!internet.get()) {
    return false;
  }

 

3、InternetConnect解析:

HINTERNET WINAPI InternetConnect(
  HINTERNET hInternet, 
  LPCTSTR lpszServerName, 
  INTERNET_PORT nServerPort, 
  LPCTSTR lpszUserName, 
  LPCTSTR lpszPassword, 
  DWORD dwService, 
  DWORD dwFlags, 
  DWORD dwContext
);
1)参数:(1)hInternet,上述InternetOpen返回的句柄。(2)lpszServerName,域名。(3)nServerPort,端口号(http的有80、443,ftp是21,以及其他一些端口号)。(4)lpszUserName和lpszPassword用户名和密码。(5)dwService,指定访问的服务器类型,有INTERNET_SERVICE_FTP、INTERNET_SERVICE_HTTP两个宏定义。(6)dwFalgs,标志位。(7)dwContext,上下文。
(8)返回值:打开指定站点的ftp或者http会话成功的句柄。
 
2)功能:打开指定站点的ftp或者http会话。
3)举例:
AutoInternetHandle connection(InternetConnect(internet.get(),
                                                host,
                                                components.nPort,
                                                NULL,    // user name
                                                NULL,    // password
                                                INTERNET_SERVICE_HTTP,
                                                0,       // flags
                                                NULL));  // context
  if (!connection.get()) {
    return false;
  }
 
4、HttpOpenRequest解析:
 
HINTERNET WINAPI HttpOpenRequest(
  HINTERNET hConnect, 
  LPCTSTR lpszVerb, 
  LPCTSTR lpszObjectName, 
  LPCTSTR lpszVersion, 
  LPCTSTR lpszReferrer, 
  LPCTSTR* lplpszAcceptTypes, 
  DWORD dwFlags, 
  DWORD dwContext 
);
1)参数:
(1)hConnet,InternetConnect成功返回的句柄。
(2)lpszVerb,访问方式。在网页里只有get和post两种方法。
(3)lpszObjectName,域名后面的地址。
(4)lpszVersion,HTTP版本,默认为HTTP/1.0
(5)lpszReferrer,引用页,抓包得到的refer
(6)lplpszAcceptAcceptType,执行一个程序接收的文件类型列表,把空值传递给HttpOpenRequest即通知了服务器只有文本文件可以被接收。
(7)dwFlags, Internet标志的掩码。举例:INTERNET_FLAG_KEEP_CONNECTION,在http协议中头添加上"Connection:Keep-Alive“字段;INTERNET_FLAG_NO_COOKIES,在http协议头中不自动增加"Cookie"字段。详情可参考:http://msdn.microsoft.com/zh-cn/subscriptions/aa917871.aspx
(8)dwContext,回调上下文。
(9)返回值,请求成功的句柄。
2、功能:创建一个请求句柄并且把参数存储在句柄中
3、举例:
DWORD http_open_flags = secure ? INTERNET_FLAG_SECURE : 0;
  http_open_flags |= INTERNET_FLAG_KEEP_CONNECTION;
  http_open_flags |= INTERNET_FLAG_NO_COOKIES;
  AutoInternetHandle request(HttpOpenRequest(connection.get(),
                                             L"POST",
                                             path,
                                             NULL,    // version
                                             NULL,    // referer
                                             NULL,    // agent type
                                             http_open_flags,
                                             NULL));  // context
  if (!request.get()) {
    return false;
  }
 
5、HttpAddRequestHeaders解析:
 
BOOL WINAPI HttpAddRequestHeaders(
  HINTERNET hHttpRequest, 
  LPCTSTR lpszHeaders, 
  DWORD dwHeadersLength, 
  DWORD dwModifiers
);
1)、参数:
(1)hHttpRequest,http请求句柄;
(2)lpszHeaders,http请求协议头;如:wstring head_accept = L"Accept: */*";
(3)dwHeadersLength,lpszHeaders长度,如果这个参数是-1,该函数认为lpszHeaders是零字符结束,其长度被计算。
(4)dwModifiers,修改操作标志,参考http://msdn.microsoft.com/zh-cn/subscriptions/aa919293.aspx
(5)返回值,成功返回TRUE,否则返回FALSE.
2)、功能:增加一个或多个http请求协议头到http请求句柄中。
3)、举例:
  wstring head_accept = L"Accept: */*";
  HttpAddRequestHeaders(request.get(),
                        head_accept.c_str(),
                        static_cast<DWORD>(-1),
                        HTTP_ADDREQ_FLAG_ADD);
  注:在http协议头中再添加一个"Accept:*/*"
 
6、HttpSendRequest解析:
 
BOOL WINAPI HttpSendRequest(
  HINTERNET hRequest, 
  LPCTSTR lpszHeaders, 
  DWORD dwHeadersLength, 
  LPVOID lpOptional, 
  DWORD dwOptionalLength
);
1)、参数:
(1)hRequest,HttpOpenRequest返回的句柄。
(2)lpszHeaders,额外的协议头。
(3)dwHeadersLength,额外协议头长度。
(4)lpOptional,要发送到http服务器上的数据内容。
(5)dwOPtionalLength,数据内容上的。
2)、功能:把请求参数送到HTTP服务器
3)、举例:
if (!HttpSendRequest(request.get(), NULL, 0,
                     const_cast<char *>(request_body.data()),
                     static_cast<DWORD>(request_body.size()))) {
    return false;
}
 
7、HttpQueryInfo解析:
BOOL WINAPI HttpQueryInfo(
  HINTERNET hRequest, 
  DWORD dwInfoLevel, 
  LPVOID lpBuffer, 
  LPDWORD lpdwBufferLength, 
  LPDWORD lpdwIndex
);
1)、参数:
(1)hRequest:HTTP请求返回的句柄。
(2)wInfoLevel:指定的属性的组合查询和请求进行修改的标志。
(3)lpBuffer:指针指向的缓冲区,接收的信息。
(4)lpdwBufferLength:指针的值包含的数据缓冲区的长度。
(5)lpdwIndex:长指针,用于列举多个具有相同名称的头一个从零开始的头索引,不需要可设置为NULL。
2)、功能:查询一个HTTP请求的信息。
3)、举例:
wchar_t http_status[4];
DWORD http_status_size = sizeof(http_status);
if (!HttpQueryInfo(request.get(), HTTP_QUERY_STATUS_CODE,
                   static_cast<LPVOID>(&http_status), &http_status_size,
                   0)) {
  return false;
}
注:HTTP_QUERY_STATUS_CODE,接收由服务器返回的状态码.
 
8、InternetQueryDataAvailable解析:
 
BOOL InternetQueryDataAvailable(
  _In_   HINTERNET hFile,
  _Out_  LPDWORD lpdwNumberOfBytesAvailable,
  _In_   DWORD dwFlags,
  _In_   DWORD_PTR dwContext
);
1)参数:
(1)hFile,HTTP请求返回的句柄。
(2)lpdwNumberOfBytesAvailable, 用于存放数据长度的指针
(3)dwFlags, 保留参数,置0
(4)dwContext,保留参数,置0
2)功能:查询可用数据的数量。
3)举例:

while (((return_code = InternetQueryDataAvailable(request, &bytes_available,    0, 0)) != 0) && bytes_available > 0) {

    vector<char> response_buffer(bytes_available);     DWORD size_read;

    return_code = InternetReadFile(request,                                    &response_buffer[0],                                    bytes_available, &size_read);

    if (return_code && size_read > 0) {       total_read += size_read;       response_body.append(&response_buffer[0], size_read);     } else {       break;     } }

 

9、InternetReadFile解析:

BOOL WINAPI InternetReadFile(   HINTERNET hFile,   LPVOID lpBuffer,   DWORD dwNumberOfBytesToRead,   LPDWORD lpdwNumberOfBytesRead );

1)参数:
(1)hFile,HTTP请求返回的句柄。
(2)lpBuffer, 接受到数据的buffer
(3)dwNumberOfBytesToRead [in], 欲读数据的字节量
(4)lpdwNumberOfBytesRead [out],接收读取字节量的变量。该函数在做任何工作或错误检查之前都设置该值为零。
2)功能:从一个由 HttpOpenRequest 函数打开的句柄中读取数据。
3)举例:

while (((return_code = InternetQueryDataAvailable(request, &bytes_available,    0, 0)) != 0) && bytes_available > 0) {

    vector<char> response_buffer(bytes_available);     DWORD size_read;

    return_code = InternetReadFile(request,                                    &response_buffer[0],                                    bytes_available, &size_read);

    if (return_code && size_read > 0) {       total_read += size_read;       response_body.append(&response_buffer[0], size_read);     } else {       break;     } }

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值