當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]引言HTTP協(xié)議我想任何IT人士都耳熟能詳了,大家都能說(shuō)出個(gè)所以然來(lái)。但是如果我問(wèn)你HTTP協(xié)議的請(qǐng)求方法有哪些?POST與GET的差 異?GET或POST傳送數(shù)據(jù)量的大小有限制嗎?HTTP響應(yīng)的狀態(tài)

引言

HTTP協(xié)議我想任何IT人士都耳熟能詳了,大家都能說(shuō)出個(gè)所以然來(lái)。但是如果我問(wèn)你HTTP協(xié)議的請(qǐng)求方法有哪些?POST與GET的差 異?GET或POST傳送數(shù)據(jù)量的大小有限制嗎?HTTP響應(yīng)的狀態(tài)有哪些?以及在C#中你如何使用?如果你不能清楚地回答其中的大部分問(wèn)題,那么這篇文 章就是為你準(zhǔn)備的!大綱如下:

· 1、HTTP概述?

o 1.1、HTTP協(xié)議的客戶端與服務(wù)器的交互

o 1.2、HTTP消息

o 1.3、HTTP請(qǐng)求的方法

o 1.4、HTTP響應(yīng)的代碼

· 2、抓包分析

· 3、POST與GET的差異

· 4、以一個(gè)實(shí)例說(shuō)明C#中如何使用POST、GET等操作?

o 4.1、HttpWebRequest

o 4.2、HttpWebResponse

o 4.3、編寫WinForm程序打開博客園首頁(yè)(附源碼)

1、HTTP概述

為了喚醒你對(duì)HTTP協(xié)議的記憶或使你能夠?qū)TTP協(xié)議有所了解,首先簡(jiǎn)單一下HTTP協(xié)議。超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法。

HTTP的發(fā)展是萬(wàn)維網(wǎng)協(xié)會(huì)(World Wide Web Consortium)和Internet工作小組(Internet Engineering Task Force)合作的結(jié)果,(他們)最終發(fā)布了一系列的RFC,其中最著名的就是RFC 2616。RFC 2616定義了HTTP協(xié)議中一個(gè)現(xiàn)今被廣泛使用的版本——HTTP 1.1。

1.1、HTTP協(xié)議的客戶端與服務(wù)器的交互

HTTP是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP)??蛻舳耸墙K端用戶,服務(wù)器端是網(wǎng)站。通過(guò)使用Web瀏覽器、網(wǎng)絡(luò)爬蟲或者其它的工具,客戶端發(fā)起一個(gè)到服務(wù)器上指定端口(默認(rèn)端口為 80)的HTTP請(qǐng)求。(我們稱這個(gè)客戶端)調(diào)用戶代理(user agent)。應(yīng)答的服務(wù)器上存儲(chǔ)著(一些)資源,比如HTML文件和圖像。(我們稱)這個(gè)應(yīng)答服務(wù)器為源服務(wù)器(origin server)。在用戶代理和源服務(wù)器中間可能存在多個(gè)中間層,比如代理,網(wǎng)關(guān),或者隧道(tunnel)。盡管TCP/IP協(xié)議是互聯(lián)網(wǎng)上最流行的應(yīng)用,HTTP協(xié)議并沒(méi)有規(guī)定必須使用它和(基于)它支持的層。事實(shí)上,HTTP可以在任何其他互聯(lián)網(wǎng)協(xié)議上,或者在其他網(wǎng)絡(luò)上實(shí)現(xiàn)。HTTP只假定(其下層協(xié)議提供)可靠的傳輸,任何能夠提供這種保證的協(xié)議都可以被其使用。

通常,由HTTP客戶端發(fā)起一個(gè)請(qǐng)求,建立一個(gè)到服務(wù)器指定端口(默認(rèn)是80端口)的TCP連接。HTTP服務(wù)器則在那個(gè)端口監(jiān)聽 客戶端發(fā)送過(guò)來(lái)的請(qǐng)求。一旦收到請(qǐng)求,服務(wù)器(向客戶端)發(fā)回一個(gè)狀態(tài)行,比如"HTTP/1.1 200 OK",和(響應(yīng)的)消息,消息的消息體可能是請(qǐng)求的文件、錯(cuò)誤消息、或者其它一些信息。

HTTP使用TCP而不是UDP的原因在于(打開一個(gè))一個(gè)網(wǎng)頁(yè)必須傳送很多數(shù)據(jù),而TCP協(xié)議提供傳輸控制,按順序組織數(shù)據(jù),和錯(cuò)誤糾正。通過(guò)HTTP或者HTTPS協(xié)議請(qǐng)求的資源由統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifiers,或者,更準(zhǔn)確一些,URI)來(lái)標(biāo)識(shí)。

客戶端與服務(wù)器端的結(jié)構(gòu)與交互過(guò)程可以表示為下面2張圖:

圖1、Web客戶端-服務(wù)器端結(jié)構(gòu)(其中web服務(wù)器的超文本鏈接,即通過(guò)網(wǎng)站上的一個(gè)鏈接跳轉(zhuǎn)到了其他服務(wù)器上)

圖2、Web客戶端與服務(wù)器端的交互

1.2、HTTP消息

客戶端與服務(wù)器之間的交互用到了兩種類型的消息:請(qǐng)求(Request)和響應(yīng)(Response)。

HTTP請(qǐng)求的格式為:

? 圖3、HTTP請(qǐng)求的格式

HTTP響應(yīng)的格式為:

圖4、HTTP響應(yīng)的格式

從上面可以看出HTTP的請(qǐng)求和響應(yīng)消息的首部均包含可變數(shù)量的字段,用一個(gè)空行(blank line)將所有首部字段(header)與消息主體(body)分隔開來(lái)。一個(gè)首部字段由字段名和隨后的冒號(hào)、一個(gè)空格和字段值組成,字段名不區(qū)分大小寫。

報(bào)文頭可分為三類:一類應(yīng)用于請(qǐng)求,一類應(yīng)用于響應(yīng),還有一類描述主體。有一些報(bào)文頭(例如:Date)既可用于請(qǐng)求又可用于響應(yīng)。描述主體的報(bào)文頭可以出現(xiàn)在POST請(qǐng)求和所有響應(yīng)報(bào)文中。HTTP的首部字段如下圖所示:

圖5、HTTP首部字段

1.3、HTTP請(qǐng)求的方法

HTTP/1.1協(xié)議中共定義了八種方法(有時(shí)也叫“動(dòng)作”)來(lái)表明Request-URI指定的資源的不同操作方式:

· OPTIONS
返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法。也可以利用向Web服務(wù)器發(fā)送'*'的請(qǐng)求來(lái)測(cè)試服務(wù)器的功能性。

· HEAD
向服務(wù)器索要與GET請(qǐng)求相一致的響應(yīng),只不過(guò)響應(yīng)體將不會(huì)被返回。這一方法可以在不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)消息頭中的元信息。

· GET
向特定的資源發(fā)出請(qǐng)求。注意:GET方法不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中,例如在Web Application中。其中一個(gè)原因是GET可能會(huì)被網(wǎng)絡(luò)蜘蛛等隨意訪問(wèn)。

· POST
向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。

· PUT
向指定資源位置上傳其最新內(nèi)容。

· DELETE
請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源。

· TRACE
回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。

· CONNECT
HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。

方法名稱是區(qū)分大小寫的。當(dāng)某個(gè)請(qǐng)求所針對(duì)的資源不支持對(duì)應(yīng)的請(qǐng)求方法的時(shí)候,服務(wù)器應(yīng)當(dāng)返回狀態(tài)碼405(Method Not Allowed);當(dāng)服務(wù)器不認(rèn)識(shí)或者不支持對(duì)應(yīng)的請(qǐng)求方法的時(shí)候,應(yīng)當(dāng)返回狀態(tài)碼501(Not Implemented)。

HTTP服務(wù)器至少應(yīng)該實(shí)現(xiàn)GET和HEAD方法,其他方法都是可選的。此外,除了上述方法,特定的HTTP服務(wù)器還能夠擴(kuò)展自定義的方法。

安全方法

開發(fā)者應(yīng)當(dāng)意識(shí)到他們的軟件代表了用戶在因特網(wǎng)上進(jìn)行交互,并且應(yīng)當(dāng)告知用戶,他們正在進(jìn)行的操作可能對(duì)他們自身或者其他人有未曾預(yù)料的重要影響。

特別地,對(duì)于GET和HEAD方法而言,除了進(jìn)行獲取資源信息外,這些請(qǐng)求不應(yīng)當(dāng)再有任何其他意義。也就是說(shuō),這些方法應(yīng)當(dāng)被認(rèn)為是“安全的”,即所謂安全的意味著該操作用于獲取信息而非修改信息??蛻舳藨?yīng)當(dāng)使用其他“非安全”方法,例如POST、PUT及DELETE來(lái)以特殊的方式(通常是按鈕而不是超鏈接)使得客戶能夠意識(shí)到可能要負(fù)的責(zé)任(例如一個(gè)按鈕帶來(lái)的資金交易)或者被告知正在請(qǐng)求的操作可能是不安全的(例如某個(gè)文件將被上傳或刪除)。

但是,不能想當(dāng)然地認(rèn)為服務(wù)器不會(huì)在處理某個(gè)GET請(qǐng)求時(shí)不會(huì)產(chǎn)生任何副作用。事實(shí)上,很多動(dòng)態(tài)資源會(huì)把這作為其特性。這里重要的區(qū)別在于用戶并沒(méi)有請(qǐng)求這一副作用,因此不應(yīng)由用戶為這些副作用承擔(dān)責(zé)任。

冪等方法

假如在不考慮諸如錯(cuò)誤或者過(guò)期等問(wèn)題的情況下,若干次請(qǐng)求的副作用與單次請(qǐng)求相同或者根本沒(méi)有副作用,那么這些請(qǐng)求方法就能夠被視作“冪等”的。 GET,HEAD,PUT和DELETE方法都有這樣的冪等屬性,同樣由于根據(jù)協(xié)議,OPTIONS,TRACE都不應(yīng)有副作用,因此也理所當(dāng)然也是冪等 的。

假如某個(gè)由若干個(gè)請(qǐng)求做成的請(qǐng)求串行產(chǎn)生的結(jié)果在重復(fù)執(zhí)行這個(gè)請(qǐng)求串行或者其中任何一個(gè)或多個(gè)請(qǐng)求后仍沒(méi)有發(fā)生變化,則這個(gè)請(qǐng)求串行便是“冪等” 的。但是,可能出現(xiàn)若干個(gè)請(qǐng)求做成的請(qǐng)求串行是“非冪等”的,即使這個(gè)請(qǐng)求串行中所有執(zhí)行的請(qǐng)求方法都是冪等的。例如,這個(gè)請(qǐng)求串行的結(jié)果依賴于某個(gè)會(huì)在 下次執(zhí)行這個(gè)串行的過(guò)程中被修改的變量。

1.4、HTTP響應(yīng)的代碼

服務(wù)器程序響應(yīng)的第一行叫狀態(tài)行。狀態(tài)行以HTTP版本號(hào)開始,后面跟著3位數(shù)字表示響應(yīng)代碼,最后是易讀的響應(yīng)短語(yǔ)。根據(jù)第一位可以把響應(yīng)分成5類:

圖6、HTTP響應(yīng)代碼

2、抓包分析

現(xiàn)在我們對(duì)HTTP基本上算是了解了,下面我用wireshark抓取打開博客園首頁(yè)時(shí),我的電腦與博客園服務(wù)器的交互過(guò)程的HTTP數(shù)據(jù)包。做好準(zhǔn)備工作,關(guān)閉一些可能干擾我們抓取打開博客園的相關(guān)程序。如下圖,我們?cè)跒g覽器中輸入www.cnblogs.com并確定時(shí),首先抓到如下包:

? 圖7、打開博客園抓取的包

從圖中可以看出,我們?cè)跒g覽器中輸入www.cnblogs.com并確定時(shí)是向服務(wù)器發(fā)送了一個(gè)HTTP請(qǐng)求消息:GET? /? HTTP/1.1。根據(jù)1.2中介紹的HTTP消息的格式,我們知道GET對(duì)應(yīng)request、/對(duì)應(yīng)request-line、HTTP/1.1對(duì)應(yīng)版本號(hào)。除了請(qǐng)求行之外,發(fā)送了一些首部字段,如:Accept、Accept-Language、User-Agent、Accept-Encoding、Host、Connection等。而且可以看出他們的格式就是:首部字段名: 字段值,注意冒號(hào)后面有個(gè)空格。

接下來(lái)我們看一下GET? /? HTTP/1.1請(qǐng)求的響應(yīng)消息是怎樣的:

圖8、GET? /? HTTP/1.1請(qǐng)求的響應(yīng)消息

響應(yīng)消息的狀態(tài)行是:HTTP/1.1? 200? OK,其中HTTP/1.1對(duì)應(yīng)版本號(hào)、200對(duì)應(yīng)response-code、OK對(duì)應(yīng)response-phrase。除了狀態(tài)行,還返回了一些首部字段,如:Cache-Control、Content-Type、Content-Encoding、Expires、Last-Modified、Vary、Server等等。(通過(guò)上圖我們可以看出,博客用的是IIS7.0)

上面抓的是GET的數(shù)據(jù)包,現(xiàn)在我來(lái)看一個(gè)POST的數(shù)據(jù)包——打開博客園首頁(yè)過(guò)程中獲取左邊的分類信息就是通過(guò)POST請(qǐng)求返回的。

圖9、POST數(shù)據(jù)包

我們可以看到,POST /ws/PublicUserService.asmx/GetLoginInfo HTTP/1.1。除了把GET換成了POST之外,其它信息差不多。下面我們放大看下發(fā)送的首部字段:

圖10、POST /ws/PublicUserService.asmx/GetLoginInfo HTTP/1.1的首部字段

NOTE:本節(jié)涉及的一些首部字段我就不在這里解釋了。我想,到了這里大家對(duì)HTTP的認(rèn)識(shí)應(yīng)該更深入了一步。

3、POST與GET的差異

1.3中介紹了8種方法,其中GET與POST最基本和常用了。表單提交中g(shù)et和post方式的區(qū)別歸納如下幾點(diǎn):

· GET是從服務(wù)器上獲取數(shù)據(jù),POST是向服務(wù)器傳送數(shù)據(jù)。

· GET是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個(gè)字段一一對(duì)應(yīng),在URL中可以看到。POST是通過(guò) HTTP POST機(jī)制,將表單內(nèi)各個(gè)字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶看不到這個(gè)過(guò)程。

· 對(duì)于GET方式,服務(wù)器端用Request.QueryString獲取變量的值,對(duì)于POST方式,服務(wù)器端用Request.Form獲取提交的數(shù)據(jù)。

· GET傳送的數(shù)據(jù)量較小,不能大于2KB(這主要是因?yàn)槭躑RL長(zhǎng)度限制)。POST傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制。但理論上,限制取決于服務(wù)器的處理能力。

· GET安全性較低,POST安全性較高。因?yàn)镚ET在傳輸過(guò)程,數(shù)據(jù)被放在請(qǐng)求的URL中,而如今現(xiàn)有的很多服務(wù)器、代理服務(wù)器或者用戶代理都會(huì) 將請(qǐng)求URL記錄到日志文件中,然后放在某個(gè)地方,這樣就可能會(huì)有一些隱私的信息被第三方看到。另外,用戶也可以在瀏覽器上直接看到提交的數(shù)據(jù),一些系統(tǒng) 內(nèi)部消息將會(huì)一同顯示在用戶面前。POST的所有操作對(duì)用戶來(lái)說(shuō)都是不可見(jiàn)的。

在FORM提交的時(shí)候,如果不指定Method,則默認(rèn)為GET請(qǐng)求(.net默認(rèn)是POST),F(xiàn)orm中提交的數(shù)據(jù)將會(huì)附加在url之后,以? 分開與url分開。字母數(shù)字字符原樣發(fā)送,但空格轉(zhuǎn)換為“+”號(hào),其它符號(hào)轉(zhuǎn)換為%XX,其中XX為該符號(hào)以16進(jìn)制表示的ASCII(或ISO Latin-1)值。GET請(qǐng)求請(qǐng)?zhí)峤坏臄?shù)據(jù)放置在HTTP請(qǐng)求協(xié)議頭中,而POST提交的數(shù)據(jù)則放在實(shí)體數(shù)據(jù)中;GET方式提交的數(shù)據(jù)最多只能有2048字節(jié),而POST則沒(méi)有此限制。POST傳遞的參數(shù)在doc里,也就http協(xié)議所傳遞的文本,接受時(shí)再解析參數(shù)部分。獲得參數(shù)。一般用POST比較好。POST提交數(shù)據(jù)是隱式的,GET是通過(guò)在url里面?zhèn)鬟f的,用來(lái)傳遞一些不需要保密的數(shù)據(jù),GET是通過(guò)在URL里傳遞參數(shù),POST不是。

說(shuō)明:關(guān)于“POST與GET的差異”查考了網(wǎng)上前輩的資料,由于找不出源頭,到處都是轉(zhuǎn)帖,這里就不貼出相關(guān)網(wǎng)址了,baidu或Google下就知道了。

4、以一個(gè)實(shí)例說(shuō)明C#中如何使用POST、GET等操作

在介紹實(shí)例之前,我們要先介紹一下HttpWebRequest和HttpWebResponse,在C#中就是用這兩個(gè)類實(shí)現(xiàn)客戶端向服務(wù)器端發(fā)送HTTP消息、客戶端接受服務(wù)器端的HTTP響應(yīng)。

4.1、HttpWebRequest

在設(shè)計(jì)實(shí)現(xiàn)實(shí)例之前我們首先要介紹一下HttpWebRequest這個(gè)類——提供WebRequest 類的HTTP 特定的實(shí)現(xiàn),HttpWebRequest類對(duì)WebRequest中定義的屬性和方法提供支持,也對(duì)使用戶能夠直接與使用 HTTP 的服務(wù)器交互的附加屬性和方法提供支持。

不要使用HttpWebRequest 構(gòu)造函數(shù)。使用System.Net.WebRequest.Create 方法初始化新的 HttpWebRequest對(duì)象。如果統(tǒng)一資源標(biāo)識(shí)符 (URI) 的方案是 http:// 或 https://,則 Create返回 HttpWebRequest對(duì)象。?

HTTP消息的首部字段(headers),在HttpWebRequest中表示為公開的屬性。下表列出了由屬性或方法設(shè)置或由系統(tǒng)設(shè)置的 HTTP 標(biāo)頭。

如果本地計(jì)算機(jī)配置指定使用代理,或者如果請(qǐng)求指定代理,則使用代理發(fā)送請(qǐng)求。如果未指定代理,則請(qǐng)求發(fā)送到服務(wù)器。

HttpWebRequest類主要包括如下方法,用于與HTTP服務(wù)器交互:

· Abort: 取消對(duì) Internet 資源的請(qǐng)求。

· AddRange: 向請(qǐng)求添加范圍標(biāo)頭。

· BeginGetRequestStream:開始對(duì)用來(lái)寫入數(shù)據(jù)的 Stream 對(duì)象的異步請(qǐng)求。

· BeginGetResponse:開始對(duì)Internet 資源的異步請(qǐng)求。

· Create:初始化新的 WebRequest。(從WebRequest 繼承。)

· CreateDefault:為指定的 URI 方案初始化新的 WebRequest 實(shí)例。(從WebRequest 繼承。)

· CreateObjRef:創(chuàng)建一個(gè)對(duì)象,該對(duì)象包含生成用于與遠(yuǎn)程對(duì)象進(jìn)行通信的代理所需的全部相關(guān)信息。 (從MarshalByRefObject 繼承。)

· EndGetRequestStream:結(jié)束對(duì)用于寫入數(shù)據(jù)的 Stream 對(duì)象的異步請(qǐng)求。

· EndGetResponse:結(jié)束對(duì) Internet 資源的異步請(qǐng)求。

· GetRequestStream:獲取用于寫入請(qǐng)求數(shù)據(jù)的 Stream 對(duì)象。

· GetResponse:返回來(lái)自 Internet 資源的響應(yīng)。

· GetSystemWebProxy:返回當(dāng)前模擬用戶的 Internet Explorer 設(shè)置中配置的代理。(從 WebRequest 繼承。)

· InitializeLifetimeService:獲取控制此實(shí)例的生存期策略的生存期服務(wù)對(duì)象。 (從 MarshalByRefObject 繼承。)

· RegisterPrefix:為指定的URI 注冊(cè)WebRequest 子代。(從WebRequest 繼承。)

4.2、HttpWebResponse

在設(shè)計(jì)實(shí)現(xiàn)實(shí)例之前我們還要介紹一下HttpWebRequest這個(gè)類——提供WebResponse 類的HTTP 特定的實(shí)現(xiàn)。此類包含對(duì)WebResponse類中的屬性和方法的 HTTP 特定用法的支持。HttpWebResponse類用于生成發(fā)送HTTP請(qǐng)求和接收HTTP響應(yīng)的HTTP獨(dú)立客戶端應(yīng)用程序。

注意

不要混淆 HttpWebResponse 和 HttpResponse 類;后者用于 ASP.NET 應(yīng)用程序,而且它的方法和屬性是通過(guò) ASP.NET 的內(nèi)部 Response 對(duì)象公開的。

決不要直接創(chuàng)建HttpWebResponse類的實(shí)例。而應(yīng)當(dāng)使用通過(guò)調(diào)用 HttpWebRequest.GetResponse 所返回的實(shí)例。您必須調(diào)用 Stream.Close 方法或 HttpWebResponse.Close 方法來(lái)關(guān)閉響應(yīng)并將連接釋放出來(lái)供重用。不必同時(shí)調(diào)用 Stream.Close 和 HttpWebResponse.Close,但這樣做不會(huì)導(dǎo)致錯(cuò)誤。

從 Internet 資源返回的公共標(biāo)頭信息公開為該類的屬性。有關(guān)完整的列表,請(qǐng)參見(jiàn)下表。可以從 Headers 屬性以名稱/值對(duì)的形式讀取其他標(biāo)頭。下表顯示可以通過(guò)HttpWebResponse類的屬性使用的公共 HTTP 標(biāo)頭。

通過(guò)調(diào)用GetResponseStream方法,以Stream的形式返回來(lái)自 Internet 資源的響應(yīng)的內(nèi)容。

HttpWebRequest類主要包括如下方法與HTTP服務(wù)器交互:(與HttpWebRequest類相比,方法較少)

· CreateObjRef:創(chuàng)建一個(gè)對(duì)象,該對(duì)象包含生成用于與遠(yuǎn)程對(duì)象進(jìn)行通信的代理所需的全部相關(guān)信息。(從MarshalByRefObject 繼承。)

· GetLifetimeService:檢索控制此實(shí)例的生存期策略的當(dāng)前生存期服務(wù)對(duì)象。(從MarshalByRefObject 繼承。)

· GetResponseHeader:獲取與響應(yīng)一起返回的標(biāo)頭的內(nèi)容。

· GetResponseStream:獲取流,該流用于讀取來(lái)自服務(wù)器的響應(yīng)的體。

· InitializeLifetimeService:獲取控制此實(shí)例的生存期策略的生存期服務(wù)對(duì)象。(從 MarshalByRefObject 繼承。)

4.3、編寫WinForm程序打開博客園首頁(yè)(附源碼)

通過(guò)前面兩小節(jié)的介紹,我們對(duì)HttpWebRequest類和HttpWebRequest類有所了解,現(xiàn)在我們就應(yīng)用它們來(lái)編寫一個(gè)小程序來(lái)實(shí)踐。程序界面大概如下:

功能也比較簡(jiǎn)單,就是通過(guò)點(diǎn)擊“在WebBrowser中顯示”按鈕就在下方的 WebBrowser控件中顯示博客園首頁(yè),通過(guò)點(diǎn)擊查看“html源碼”按鈕就彈出一個(gè)對(duì)話框顯示博客園首頁(yè)的html源碼。

首先我們介紹如何實(shí)現(xiàn)——通過(guò)點(diǎn)擊查看“html源碼”按鈕就彈出一個(gè)對(duì)話框顯示博客園首頁(yè)的html源碼。核心代碼如下:

通過(guò)點(diǎn)擊查看“html源碼”按鈕就彈出一個(gè)對(duì)話框顯示博客園首頁(yè)的html源碼? private string GetCnBlogs()

??????? {

string html = String.Empty;????????????

??????????? HttpWebRequest cnbogs = (HttpWebRequest)System.Net.WebRequest.Create(txtURL.Text.ToString());

??????????? cnbogs.Accept = "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, */*";

??????????? cnbogs.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MALN; CIBA; InfoPath.2; .NET4.0C; .NET4.0E; Media Center PC 6.0; Tablet PC 2.0; AskTB5.6)";

??????????? cnbogs.Method = "GET";

??????????? HttpWebResponse cnblogsRespone = (HttpWebResponse)cnbogs.GetResponse();

if (cnblogsRespone != null&&cnblogsRespone.StatusCode==HttpStatusCode.OK)

??????????? {

using(StreamReader sr = new StreamReader(cnblogsRespone.GetResponseStream()))??

??????????????? {

??????????????????? html = sr.ReadToEnd();

??????????????? }

??????????? }

return html;

??????? }

private void btnGetHtml_Click(object sender, EventArgs e)

??????? {

??????????? MessageBox.Show(GetCnBlogs());????????????

??????? }

其實(shí)這個(gè)過(guò)程更我們通過(guò)在瀏覽器中輸入博客園網(wǎng)站打開效果是一樣的,只不過(guò)在這里我們是通過(guò)HttpWebRequest類和HttpWebRequest類的對(duì)象來(lái)實(shí)現(xiàn)的。

然而,通過(guò)點(diǎn)擊“在WebBrowser中顯示”按鈕就在下方的 WebBrowser控件中顯示博客園首頁(yè)的功能類似,只不過(guò)是在WebBrowser控件中顯示且我這里把一些常用的HTTP相關(guān)的操作封裝到一個(gè)命名 空間Helper中,便于以后使用,本質(zhì)跟上面的是一樣的。點(diǎn)擊下載整個(gè)項(xiàng)目的源碼。

我這個(gè)源碼還是比較簡(jiǎn)陋,只是簡(jiǎn)單地實(shí)現(xiàn)了使用HttpWebRequest類和HttpWebRequest類與HTTP服務(wù)器交互,更完善的功能期待你去完成。

補(bǔ)充說(shuō)明:關(guān)于url的長(zhǎng)度限制問(wèn)題,IE的url最長(zhǎng)可以傳 2083 字符(半角),而GET最多只能到2048字符。但是RFC 2616,Hypertext Transfer Protocol -- HTTP/1.1,并沒(méi)有對(duì)url的最大長(zhǎng)度做限制。

參考:寫此文章時(shí),我參閱了不少文章,我列舉其中印象比較深的

· 維基百科(HTTP),http://zh.wikipedia.org/zh-cn/HTTP

· MSDN(HttpWebRequest),http://msdn.microsoft.com/zh-cn/library/8y7x3zz2%28v=VS.80%29.aspx

· MSDN(HttpWebResponse),http://msdn.microsoft.com/zh-cn/library/system.net.httpwebresponse%28VS.80%29.aspx

· TCP/IP協(xié)議詳解卷3


作者:吳秦

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉