WinHTTP教程
最近有些忙,也沒更新BLOG,這幾天在搗鼓一個小玩意要用到WinHTTP API,發(fā)現資料很少,而且大都是些MFC封裝的例子,看得我是一個頭幾個大。就把自己關于WinHTTP的學習總結了一下,僅供參考,各人理解可能有區(qū)別。另外非常感謝前人在網絡上提供的相關參考。
BTW:Google Chrome就是基于WinHTTP寫的,如果想深入學習,可以閱讀分析Chrome Code.
從此處獲取Chrome的源代碼等相關信息
SVN: http://src.chromium.org/svn/trunk/src/chrome/
VIEW: http://src.chromium.org/viewvc/
WinHTTP APIs是一組用來進行HTTP操作的函數,相比WinINet更加安全和健壯一些。
WinHTTP API List:
WinHttpAddRequestHeaders
WinHttpCheckPlatform
WinHttpCloseHandle
WinHttpConnect
WinHttpCrackUrl
WinHttpCreateUrl
WinHttpDetectAutoProxyConfigUrl
WinHttpGetDefaultProxyConfiguration
WinHttpGetIEProxyConfigForCurrentUser
WinHttpGetProxyForUrl
WinHttpOpen
WinHttpOpenRequest
WinHttpQueryAuthSchemes
WinHttpQueryDataAvailable
WinHttpQueryHeaders
WinHttpQueryOption
WinHttpReadData
WinHttpReceiveResponse
WinHttpSendRequest
WinHttpSetCredentials
WinHttpSetDefaultProxyConfiguration
WinHttpSetOption
WinHttpSetStatusCallback
WinHttpSetTimeouts
WinHttpTimeFromSystemTime
WinHttpTimeToSystemTime
WinHttpWriteData
WinHTTP API邏輯上分成三個獨立的對象進行建模:會話對象、連接對象、請求對象。大致為:
初始化WinHTTP(獲得會話對象,)–>創(chuàng)建連接(連接1,連接2,…N)–>發(fā)送請求(請求1,請求2,….N)
會話對象、連接對象、請求對象都由HINTERNET句柄表示,句柄的使用傳遞過程大致為:
WinHttpOpen–>return Session handle
|
WinHttpConnect–>return Connection handle
|
WinHttpOpenRequest–>return Request handle
各對象句柄可以使用WinHttpCloseHandle進行關閉。為了進一步加深了解WinHTTP APIs的調用過程和關系,我們來看下面的圖:
(圖來自MSDN)
會話對象
會話對象使用WinHttpOpen函數來進行創(chuàng)建。函數原形如下:
HINTERNET WinHttpOpen(
__in LPCWSTR pwszUserAgent,
__in DWORD dwAccessType,
__in LPCWSTR pwszProxyName,
__in LPCWSTR pwszProxyBypass
__in DWORD dwFlags
);
第一個參數指向一個應用程序自身名稱及版本的字符串,使用在HTTP協議的User Agent中。如:Mozilla/4.0
第二個參數是WinHttp的訪問類型要求。可能為下列值
WINHTTP_ACCESS_TYPE_NO_PROXY //不使用默認代理服務器
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY //使用默認的代理服務器(儲存在注冊表中的WINHTTP代理設置,注意:與IE的代理設置不同,為獨立的)
WINHTTP_ACCESS_TYPE_NAMED_PROXY //使用指定的代理服務器設置
第三個參數指向一個代理服務器名稱的字符串,如果前一個參數dwAccessType未設置為WINHTTP_ACCESS_TYPE_NAMED,這個參數就必須為WINHTTP_NO_PROXY_NMAE。
第四個參數指向一個HTTP服務器列表,其中的服務器不能通過前一個參數指定的代理服務器進行路由(這與IE代理服務器設置中的例外情況設置類似)
第五個參數定義了一個標記,當前只定義了一個標記
WINHTTP_FLAG_ASYNC //指示WinHTTP API將異步執(zhí)行。
連接對象
連接對象使用WinHttpConnect函數來進行創(chuàng)建(注意前面提到的一個會話對象可以創(chuàng)建多個連接對象)。函數原形如下:
HINTERNET WinHttpConnect(
__in HINTERNET hSession,
__in LPCWSTR pswzServerName,
__in INTERNET_PORT nServerPort
__in reserved DWORD dwReserved
);
第一個參數指定連接的所屬會話句柄。
第二個參數指定連接的服務器名稱或IP地址
第三個參數指定服務器的端口號,這個參數還可以指定為下列值
INTERNET_DEFAULT_HTTP_PORT //使用默認HTTP Service端口號80
INTERNET_DEFAULT_HTTPS_PORT //使用默認HTTPS安全連接端口號443
INTERNET_DEFAULT_PORT //常規(guī)HTTP請求使用80,HTTPS請求使用443(這是個便利的參數值)
第四個參數是保留的,必須為0
請求對象
請求對象使用WinHttpOpenRequest函數來進行創(chuàng)建(注意前面提到的一個連接對象可以創(chuàng)建多個請求對象)。從請求對象開始,就進入原本目的HTTP操作了。函數原形如下:
HINTERNET WinHttpOpenRequest(
__in HINTERNET hConnect,
__in LPCWSTR pwszVerb,
__in LPCWSTR pwszObjectName,
__in LPCWSTR pwszVersion,
__in LPCWSTR pwszReferrer,
__in LPCWSTR *ppwszAcceptTypes,
__in DWORD dwFlags
)
第一個參數指定請求所屬的連接句柄
第二個參數指定HTTP協議動作(如:GET、POST和HEAD),如果此參數為NULL,函數會默認使用GET。
第三個參數指定正在請求的資源名稱和相對路徑
第四個參數指定使用的HTTP協議版本,如果此參數為NULL,函數會默認使用HTTP/1.1
第五個參數指定引用的URL,如果沒有,可以設置為WINHTTP_NO_REFERER
第六個參數指定客戶端(本應用程序)將接受的媒體類型(如:image/gif、text/*、*/*),一般可以指定為WIN_HTTP_DEFAULT_ACCEPT_TYPES。
第七個參數指定請求行為標記,如可以指定為WINHTTP_FLAG_SECURE標記發(fā)出HTTPS請求,一般可以為0。其他可指定值請參考MSDN,我就不羅列了。
至此介紹了三個WinHTTP API,經過這個過程就基本建立了一個HTTP網絡連接。由此我們已經對WInHTTP有了基本概念性的認識。WinHTTP APIs(2)中將再介紹利用WinHTTP API進行更為復雜的操作和實際的應用例子
總結
- 上一篇: WordPress设置页面的加载机制
- 下一篇: map通过jsonobject转成实体类