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