国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

WinHTTP會(huì)話概述

2019-11-06 08:19:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

WinHTTP會(huì)話概述

Microsoft Windows HTTP服務(wù)(WinHTTP)公開了一組C / C ++函數(shù),使您的應(yīng)用程序能夠訪問(wèn)Web上的HTTP資源。 本主題概述了如何使用這些函數(shù)與HTTP服務(wù)器交互。

0x01.使用WinHTTP API訪問(wèn)Web

下圖顯示了與HTTP服務(wù)器交互時(shí)通常調(diào)用WinHTTP函數(shù)的順序。 陰影框表示生成HINTERNET句柄的函數(shù),而平面框表示使用這些句柄的函數(shù)。

這里寫圖片描述

0x02.初始化WinHTTP

在與服務(wù)器交互之前,WinHTTP必須通過(guò)調(diào)用WinHttpOpen進(jìn)行初始化。 WinHttpOpen創(chuàng)建會(huì)話上下文以維護(hù)有關(guān)HTTP會(huì)話的詳細(xì)信息,并返回會(huì)話句柄。使用此句柄,WinHttpConnect功能然后能夠指定目標(biāo)HTTP或安全超文本傳輸??協(xié)議(HTTPS)服務(wù)器。

注意: 對(duì)特定資源發(fā)出請(qǐng)求之前,對(duì)WinHttpConnect的調(diào)用不會(huì)導(dǎo)致與HTTP服務(wù)器的實(shí)際連接。

0x03.打開請(qǐng)求

WinHttpOpenRequest函數(shù)打開特定資源的HTTP請(qǐng)求,并返回一個(gè)可以被其他HTTP函數(shù)使用的HINTERNET句柄。 WinHttpOpenRequest在調(diào)用時(shí)不會(huì)將請(qǐng)求發(fā)送到服務(wù)器。 WinHttpSendRequest函數(shù)實(shí)際上通過(guò)網(wǎng)絡(luò)建立連接并發(fā)送請(qǐng)求。

以下示例顯示了使用默認(rèn)選項(xiàng)調(diào)用WinHttpOpenRequest的示例。

HINTERNET hRequest = WinHttpOpenRequest(hConnect,L“GET”,NULL,NULL,NULL,NULL,0);

0x04.添加請(qǐng)求標(biāo)頭

WinHttpAddRequestHeaders函數(shù)允許應(yīng)用程序?qū)⒏郊拥淖杂筛袷秸?qǐng)求頭附加到HTTP請(qǐng)求句柄。它適用于需要精確控制發(fā)送到HTTP服務(wù)器的請(qǐng)求的復(fù)雜應(yīng)用程序。

WinHttpAddRequestHeaders函數(shù)需要一個(gè)由WinHttpOpenRequest創(chuàng)建的HTTP請(qǐng)求句柄,該字符串包含頭部,頭部的長(zhǎng)度和任何修飾符。

以下修飾符可以與WinHttpAddRequestHeaders一起使用。

Modifier Description
WINHTTP_ADDREQ_FLAG_ADD 添加標(biāo)題(如果它不存在)。與WINHTTP_ADDREQ_FLAG_REPLACE一起使用。
WINHTTP_ADDREQ_FLAG_ADD_IF_NEW 只有當(dāng)頭不存在時(shí)才添加頭;否則返回錯(cuò)誤。
WINHTTP_ADDREQ_FLAG_COALESCE 合并同名的標(biāo)題。
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA 使用逗號(hào)合并同名的標(biāo)題。例如,用此標(biāo)志添加“Accept:text / ”后跟“Accept:audio / ”形成單個(gè)標(biāo)題“Accept:text / ,audio / ”,導(dǎo)致找到的第一個(gè)標(biāo)題合并。它取決于調(diào)用應(yīng)用程序以確保關(guān)于合并/單獨(dú)頭部的粘性方案。
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON 使用分號(hào)合并同名的標(biāo)題。
WINHTTP_ADDREQ_FLAG_REPLACE 替換或刪除標(biāo)頭。如果標(biāo)頭值為空,并且找到標(biāo)頭,則將其刪除。如果標(biāo)頭值不為空,則替換標(biāo)頭值。

0x05.發(fā)送請(qǐng)求

WinHttpSendRequest函數(shù)建立與服務(wù)器的連接,并將請(qǐng)求發(fā)送到指定的站點(diǎn)。此函數(shù)需要一個(gè)由WinHttpOpenRequest創(chuàng)建的HINTERNET句柄。 WinHttpSendRequest也可以發(fā)送附加頭或可選信息。可選信息通常用于向服務(wù)器寫入信息的操作,例如PUTPOST。 在WinHttpSendRequest函數(shù)發(fā)送請(qǐng)求后,應(yīng)用程序可以使用HINTERNET句柄上的WinHttPReadDataWinHttpQueryDataAvailable函數(shù)下載服務(wù)器的資源。

0x06.將數(shù)據(jù)發(fā)布到服務(wù)器

要將數(shù)據(jù)發(fā)布到服務(wù)器,調(diào)用WinHttpOpenRequest中的HTTP動(dòng)詞必須是POSTPUT。當(dāng)調(diào)用WinHttpSendRequest時(shí),dwTotalLength參數(shù)應(yīng)設(shè)置為以字節(jié)為單位的數(shù)據(jù)大小。然后使用WinHttpWriteData將數(shù)據(jù)發(fā)布到服務(wù)器。 或者,將WinHttpSendRequestlpOptional參數(shù)設(shè)置為包含要發(fā)布到服務(wù)器的數(shù)據(jù)的緩沖區(qū)的地址。使用此技術(shù)時(shí),必須將WinHttpSendRequestdwOptionalLengthdwTotalLength參數(shù)設(shè)置為要發(fā)布的數(shù)據(jù)的大小。以這種方式調(diào)用WinHttpSendRequest消除了調(diào)用WinHttpWriteData的需要。

0x07.獲取有關(guān)請(qǐng)求的信息

WinHttpQueryHeaders函數(shù)允許應(yīng)用程序檢索有關(guān)HTTP請(qǐng)求的信息。該函數(shù)需要由WinHttpOpenRequest創(chuàng)建的HINTERNET句柄,信息級(jí)別值和緩沖區(qū)長(zhǎng)度。 WinHttpQueryHeaders也接受一個(gè)存儲(chǔ)信息的緩沖區(qū)和一個(gè)基于零的頭索引,枚舉多個(gè)同名的頭。 使用在查詢信息標(biāo)志頁(yè)面上找到的任何信息級(jí)別值以及一個(gè)修飾符來(lái)控制信息存儲(chǔ)在WinHttpQueryHeaderslpvBuffer參數(shù)中的格式。

0x08.從Web下載資源

在使用WinHttpOpenRequest函數(shù)打開請(qǐng)求后,使用WinHttpSendRequest將其發(fā)送到服務(wù)器,并準(zhǔn)備請(qǐng)求句柄以接收具有WinHttpReceiveResponse的響應(yīng),應(yīng)用程序可以使用WinHttpReadDataWinHttpQueryDataAvailable函數(shù)從HTTP服務(wù)器下載資源。

以下示例代碼顯示如何使用安全事務(wù)語(yǔ)義下載資源。示例代碼初始化WinHTTP應(yīng)用程序編程接口(API),選擇目標(biāo)HTTPS服務(wù)器,然后打開并發(fā)送此安全資源的請(qǐng)求。 WinHttpQueryDataAvailable與請(qǐng)求句柄一起使用,以確定有多少數(shù)據(jù)可供下載,然后WinHttpReadData用于讀取該數(shù)據(jù)。重復(fù)該過(guò)程,直到整個(gè)文檔被檢索和顯示。

DWord dwSize = 0; DWORD dwDownloaded = 0; LPSTR pszOutBuffer; BOOL bResults = FALSE; HINTERNET hsession = NULL, hConnect = NULL, hRequest = NULL; // Use WinHttpOpen to obtain a session handle. hSession = WinHttpOpen( L"WinHTTP Example/1.0", WINHTTP_access_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0 ); // Specify an HTTP server. if( hSession ) hConnect = WinHttpConnect( hSession, L"www.microsoft.com", INTERNET_DEFAULT_HTTPS_PORT, 0 ); // Create an HTTP request handle. if( hConnect ) hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE ); // Send a request. if( hRequest ) bResults = WinHttpSendRequest( hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0 ); // End the request. if( bResults ) bResults = WinHttpReceiveResponse( hRequest, NULL ); // Keep checking for data until there is nothing left. if( bResults ) { do { // Check for available data. dwSize = 0; if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) ) printf( "Error %u in WinHttpQueryDataAvailable./n", GetLastError( ) ); // Allocate space for the buffer. pszOutBuffer = new char[dwSize+1]; if( !pszOutBuffer ) { printf( "Out of memory/n" ); dwSize=0; } else { // Read the data. ZeroMemory( pszOutBuffer, dwSize+1 ); if( !WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded ) ) printf( "Error %u in WinHttpReadData./n", GetLastError( ) ); else printf( "%s", pszOutBuffer ); // Free the memory allocated to the buffer. delete [] pszOutBuffer; } } while( dwSize > 0 ); } // Report any errors. if( !bResults ) printf( "Error %d has occurred./n", GetLastError( ) ); // Close any open handles. if( hRequest ) WinHttpCloseHandle( hRequest ); if( hConnect ) WinHttpCloseHandle( hConnect ); if( hSession ) WinHttpCloseHandle( hSession );
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 象山县| 都昌县| 洛隆县| 固阳县| 云和县| 普兰店市| 新郑市| 佛教| 汝南县| 建水县| 青川县| 三亚市| 聂拉木县| 兴业县| 南郑县| 定日县| 阿拉尔市| 名山县| 桐梓县| 邵武市| 新源县| 绍兴县| 巴楚县| 宁阳县| 遂溪县| 永昌县| 甘孜| 汤原县| 九江市| 慈溪市| 建平县| 靖江市| 平顺县| 唐山市| 崇信县| 连江县| 平远县| 正阳县| 长岛县| 罗江县| 惠水县|