1. 程式人生 > >Http請求格式(在Linux下使用telnet親測,通過這篇我才明白)

Http請求格式(在Linux下使用telnet親測,通過這篇我才明白)

語法 設置 rdquo 我們 令行 ati 訪問性 idl lib

命令行窗口中用telnet測試HTTP協議請求消息格式響應消息格式1. 命令行窗口中用telnet測試HTTP協議
HTTP消息是由普通ASCII文本組成。消息包括消息頭和數據體部分。消息頭以行為單位,每行以CRLF(回車和換行)結束,消息頭結束後,額外增加一個CRLF,之後內容就是數據體部分了。
我們可以在命令行窗口,通過TELNET,來測試HTTP協議。
1. 使用telnet連接到HTTP服務器,如要從google上請求index.html頁面,首先要連接到服務器的80端口

telnet www.google.cn 80
2. 現在已經連接上了服務器,發送http請求消息:
GET /index.html HTTP/1.1

connection: close
Host: www.google.cn
輸入上面內容後,連續敲入兩個回車,哈哈,是不是看到返回結果了。
這個請求的意思是:通過1.1版本協議請求index.html頁面;connection: close是實用短連接,即服務器返回後就斷開連接;Host字段知名頁面所在的主機名。
返回結果應該是這樣的:
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Date: Fri, 02 Jan 2009 12:26:17 GMT
Expires: -1
Content-Type: text/html; charset=GB2312
Set-Cookie: PREF=ID=7bbe374f53b6c6a8:NW=1:TM=1230899177:LM=1230899177:S=2EGHuZJnrtdQUB_A; expires=Sun, 02-Jan-2011 12:26:17 GMT; path=/; domain=.google.com
Server: gws
Transfer-Encoding: chunked
Connection: Close
這裏有一個額外的CRLF
<html>
html數據
</html>
2. 請求消息格式
下圖是HTTP協議請求的一般格式:

•請求行
第一行是請求行:請求方法 URL路徑 HTTP版本號,上面的例子中的請求行是:
GET /index.html HTTP/1.1
使用GET方法請求服務器根目錄下的index.html文件,約定使用HTTP/1.1版本。
請求方法包括GET、POST、HEAD、OPTIONS、TRACE、PUT等幾種,最常用的前2種。
1. GET方法。通過將參數附加在URL後面提交參數。如http://www.google.cn/search?hl=zh-CN&newwindow=1&rls=com.microsoft%3Azh-cn%3AIE-SearchBox&q=%E6%89%8B%E6%9C%BA&meta=&aq=f&oq=

GET
2. POST方法。通過將參數附加在請求的頭部行後面(GET方式是沒有數據體的)提交參數。GET方式提交參數數據量一般限制在1k一下,而POST是沒有限制的。POST一般用在表單數據提交的時候。
3. HEAD方法不讓服務器在回應中返回任何實體。對HEAD請求的回應部分來說,它的HTTP標題中包含的元信息與通過GET請求所得到的是相同的。通過使用這種方法,不必傳輸整個實體主體,就可以得到請求URI所指定資源的元信息。該方法通常用來測試超鏈接的合法性、可訪問性及最近更新。

•頭部行
頭部行中的內容一般用來描述客戶端能兼容的類型。如Accept-Language告訴服務器客戶端支持哪些語言;Cache-Control告訴服務器客戶端是否支持cache。
•附屬體(數據實體)
請求的附屬體,GET不適用,POST方法提交數據時,用來存放請求的參數。
•客戶端傳遞參數方式
1. GET方式傳遞,直接在URL後面。
2. POST方式傳遞,請求行告訴服務器參數長度,通過附屬體獨立傳給服務器。
3. Cookie方式傳遞,不要忘記這種方式了,會話Session功能就是通過這種方式實現的哦。
•一些常用的頭部行請求參數
User-Agent:客戶端的瀏覽器信息。
Connection:close表示使用短連接,Keep-Alive表示客戶端支持持久連接。
Date:消息產生的當前時間。
Accept-Language:客戶端支持的語言。
Cache-Control:客戶端是否支持cache。no-cache表示客戶端不支持cache,如max-age=3600,告訴User Agent 該請求的響應結果在多長時間內有效,在有效期內,當用戶再次需要訪問時,直接從客戶端本地提取,不需要訪問服務器。
Referer:Referer用以告訴服務器該請求來自於哪個URL,可以用追蹤用戶的WEB訪問路徑。
If-Modified-Since: 如果請求消息包含If-Modified-Since標題域,GET方法的語法就變成“條件GET”,即“(conditional GET)”。 條件GET方法可以對指定資源進行判斷,如果它在If-Modified-Since標題域中的指定日期後發生了更新,才啟動傳輸,否則不傳輸。這種條件GET允許被緩存的實體在不必經過多次請求或不必要的數據傳輸就能進行刷新,從而有助於降低網絡負載。
Last-Modified: Sun, 03 Dec 2008 23:52:56 GMT
ETag: “1cbf3-dfd-3a2adcd8″
一般應用在文件下載上,用於標識響應內容的最後修改時間或內容較驗碼,當下一次User agent需要時,服務首先判斷這二個值是否跟服務器上一致,一樣則不需要返回內容。
Expires:該請求的響應結果在什麽時間失效,在沒有失效之前,代理可直接從緩存中返回以前的響應結果。
Host:指定請求資源的主機和端口號。HTTP/1.1請求必須指定Host,否則服務器會返回400狀態碼。


•請求消息例子
GET請求例子:
GET /css/news070130.css HTTP/1.1
Accept: */*
Referer: http://news.qq.com/a/20081224/000088.htm
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
If-Modified-Since: Thu, 29 Mar 2007 02:05:43 GMT; length=11339
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: news.qq.com
Connection: Keep-Alive
Cookie: ssid=idlsesels; flv=9.0; icache=ADLFMBGC; adid=adsdifids; isflucky_50829637=0;
POST請求例子:
POST /Login.PHP HTTP/1.1
Accept: image/gif,*/*
Accept-language: zh-cn
Accept-encodeing: gzip
User-Agent: MSIE6.0
Host: www.some.com
Connection: Keep-Alive
Content-Length: 7
Cache-Control:no-cache
Cookie: name1=value1; name2=value2;
這裏有一個額外的CRLF
username=b&passwd=d


3. 響應消息格式

響應消息包括狀態行、若幹頭部行和附屬體(html數據實體)。
•狀態行
狀態行包括:HTTP協議版本號、狀態碼、狀態碼的文本描述信息。如:HTTP/1.1 200 OK
狀態碼由一個三位數組成,狀態碼大體有5種含義:
1. 1xx。信息,請求收到,繼續處理。
2. 2xx。成功。200請求成功;206斷點續傳。
3. 3xx。重定向。一般跳轉到新的地址。
4. 4xx。客戶端錯誤。404文件不存在
5. 5xx。服務器錯誤。500內部錯誤。
•頭部行
Set-Cookie:服務器設置客戶端Cookie。設置格式是name=value,設置多個參數時中間用分號隔開。Set-Cookie時還會用到幾個參數:PATH設置有效的路徑,DOMAIN設置cookie生效的域名,Expire設置cookie的有效時間,0表示關閉瀏覽器就失效。
Location:當服務器返回3xx重定向時,該參數實現重定向。廣告鏈接的跳轉就使用這種協議。
Content-Length:附屬體(數據實體)的長度

http://blog.csdn.net/w616589292/article/details/44353003

Http請求格式(在Linux下使用telnet親測,通過這篇我才明白)