C++之HTTP

http请求大多包含在winhttp.h内,流程如下

WinHttpOpen函数-返回winhttp-session句柄

https://docs.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpopen

WINHTTPAPI HINTERNET WinHttpOpen(
  LPCWSTR pszAgentW,
  DWORD   dwAccessType,
  LPCWSTR pszProxyW,
  LPCWSTR pszProxyBypassW,
  DWORD   dwFlags
);

pszAgentW:指向字符串变量的指针,包含调用WinHTTP函数的应用程序或实体的名称,用作用户代理
  
dwAccessType:设置访问类型,其实就是各种代理的设置
  WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
	WINHTTP_ACCESS_TYPE_NAMED_PROXY
	WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY
	WINHTTP_ACCESS_TYPE_NO_PROXY 不使用代理进行通讯

pszProxyW:一个指针
  当dwAccessType=WINHTTP_ACCESS_TYPE_NAMED_PROXY,仅仅识别HTTP的CERN类型的代理
  当dwAccessType!=WINHTTP_ACCESS_TYPE_NAMED_PROXY,此处必须设置WINHTTP_NO_PROXY_NAME

pszProxyBypassW:
  当dwAccessType=WINHTTP_ACCESS_TYPE_NAMED_PROXY时,指向不想走代理的IP地址或主机名
  当dwAccessType!=WINHTTP_ACCESS_TYPE_NAMED_PROXY,此处必须设置WINHTTP_NO_PROXY_BYPASS

dwFlags:
  一般都为0

WinHttpConnect函数--返回链接句柄



WINHTTPAPI HINTERNET WinHttpConnect(
  HINTERNET     hSession,
  LPCWSTR       pswzServerName,
  INTERNET_PORT nServerPort,
  DWORD         dwReserved
);

hSession:先前在WinHttpOpen返回的句柄

pswzServerName:指针,指向需要请求的服务器的IP或者主机名
  
nServerPort:指向目标端口
  INTERNET_DEFAULT_HTTP_PORT  80
	INTERNET_DEFAULT_HTTPS_PORT  443 
  INTERNET_DEFAULT_PORT  80&443
  
dwReserved:保留参数,必须为0!

WinHttpOpenRequest函数-创建http请求句柄

https://docs.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpopenrequest

WINHTTPAPI HINTERNET WinHttpOpenRequest(
  HINTERNET hConnect,
  LPCWSTR   pwszVerb,
  LPCWSTR   pwszObjectName,
  LPCWSTR   pwszVersion,
  LPCWSTR   pwszReferrer,
  LPCWSTR   *ppwszAcceptTypes,
  DWORD     dwFlags
);

hConnect:WinHttpConnect返回的句柄
  
pwszVerb:指定要用的方法,如果未NULL则使用GET,此处方法必须全部为大写字母!
  
pwszObjectName:资源名称,目标文件名
  
pwszVersion:http版本,如果未NULL则使用HTTP /1.1
  
pwszReferrer:常规使用设置WINHTTP_NO_REFERER即可
  
ppwszAcceptTypes:指定客户端接受的媒体类型可设置WINHTTP_DEFAULT_ACCEPT_TYPES
 
dwFlags:通常为0

WinHttpAddRequestHeaders函数-设置http头

https://docs.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpaddrequestheaders

BOOLAPI WinHttpAddRequestHeaders(
  HINTERNET hRequest,
  LPCWSTR   lpszHeaders,
  DWORD     dwHeadersLength,
  DWORD     dwModifiers
);

hRequest:WinHttpOpenRequest返回的句柄
  
lpszHeaders:包含了要附加到http请求上的头部信息,每个头部之间用 回车/换行 (CR/LF) 隔开

dwHeadersLength:头部的长度
  
dwModifiers:修饰作用,可以直接设定为WINHTTP_ADDREQ_FLAG_ADD

WinHttpSendRequest函数-发送http请求

BOOLAPI WinHttpSendRequest(
  HINTERNET hRequest,
  LPCWSTR   lpszHeaders,
  DWORD     dwHeadersLength,
  LPVOID    lpOptional,
  DWORD     dwOptionalLength,
  DWORD     dwTotalLength,
  DWORD_PTR dwContext
);

hRequest;WinHttpOpenRequest返回的句柄

lpszHeaders:附加的http头,没有要附加的设置0即可,也可WINHTTP_NO_ADDITIONAL_HEADERS

dwHeadersLength:指定头的字符串大小
  
lpOptional:指向缓冲区的指针,包含要在请求标头之后立即发送的任何可选数据,常用于POST和PUT,如果没有要发送的可以设置为WINHTTP_NO_REQUEST_DATA

dwOptionalLength:额外内容的长度
  
dwTotalLength:总长度
  
dwContext:通常为0

WinHttpReceiveResponse函数-等待http回应

WINHTTPAPI BOOL WinHttpReceiveResponse(
  HINTERNET hRequest,
  LPVOID    lpReserved
);

hRequest:WinHttpSendRequest返回的句柄
  
lpReserved:保留参数设置NULL即可
  
此处如果有回应则会返回TRUE 

WinHttpQueryDataAvailable函数-返回http回应内容的信息

BOOLAPI WinHttpQueryDataAvailable(
  HINTERNET hRequest,
  LPDWORD   lpdwNumberOfBytesAvailable
);

hRequest:返回WinHttpOpenRequest句柄,此处句柄调用WinHttpReceiveResponse
  
lpdwNumberOfBytesAvailable:务必设置NULL,用来接收内容长度

WinHttpReadData函数-获得http回应内容的信息

BOOLAPI WinHttpReadData(
  HINTERNET hRequest,
  LPVOID    lpBuffer,
  DWORD     dwNumberOfBytesToRead,
  LPDWORD   lpdwNumberOfBytesRead
);

hRequest:返回WinHttpOpenRequest句柄
  
lpBuffer:指定存放数据的缓存区
  
dwNumberOfBytesToRead:缓存区大小长度
  
lpdwNumberOfBytesRead:始终设置NULL即可
联系邮箱:yang_s1r@163.com 博客园地址:https://www.cnblogs.com/Yang34/
原文地址:https://www.cnblogs.com/Yang34/p/14398658.html