一、URL格式
http:\\host[:port][abs_path][:parameters][?query]#fragment
例如:http://www.imailtone.com:80/WebApplication1/WebForm1.aspx?name=tom&;age=20#resume
http表示要通過HTTP協議來定位網絡資源。
host表示合法的因特網主機域名或者IP地址。
port用於表示在傳輸層上交換信息的進程端口號,http協議默認端口號爲80,當然採用不同的協議默認端口號不同。
abs_path指定請求資源的URI(統一資源定位符)。
parameters參數用於指定特殊參數的可選項。
?query可選,用於給動態網頁(使用PHP/JSP等製作的網頁)傳遞參數,可以有多個參數,用“&”符號隔開,每個參數的鍵值之間用‘=’隔開。
可以這樣解析URL地址(Python)
import urlparse
lis = urlparse.urlparse(url)
url ='http://zh.wikipedia.org:80/wiki/Special:Search?search=鐵路&Go=go'
完全按照上面的格式解析了URL地址
http 是協議;
zh.wikipedia.org,是服務器;
80 是HTTP協議默認端口;
/wiki/Special:Search 服務器上存放該資源的目錄路徑
query='search=\xcc\xfa\xc2\xb7&go=Go' 是動態網頁的查詢
二、服務器通過HTTP與瀏覽器的交互
(1)http請求
客戶端通過發送http請求向服務器請求資源的訪問
http請求由三部分組成,分別是:請求行、消息報頭、請求正文。
請求行的格式如下:
MethodRequest-URIHTTP-VersionCRLF
第一個參數方法符號,詳細方法下面將列出
第二個參數是請求URI(統一資源定位符)
第三個參數表示協議版本
第四個是換行符
這四部分均以空格間隔,除了結尾外,其他三部分不允許出現CR或者LF字符
例如 GET /tmp.html HTTP/1.1 (CRLF)
(2)http請求方法
下面是一些例子:
GET方法: 當我們通過瀏覽器的地址欄輸入網址的方式去訪問網頁的時候,瀏覽器就是採用GET方法向服務器獲取資源。
如:GET Request-URL HTTP/1.1
POST方法:該方法用於向服務器發送請求,這種方法要求服務器接收附在請求後面的數據,多用於提交表單數據
如:POST /login.jsp HTTP/1.1 (CRLF)
注意,在HTML文檔中,書寫get和post,不區分大小寫,但HTTP協議中的GET和POST只能是大寫形式。
HEAD方法:HEAD方法與GET方法幾乎是一樣的,它們的區別在於HEAD方法只是請求消息報頭,而不是完整的內容。
利用這個方法,不必傳輸整個資源的內容,就可以得到Request-URI所標識的資源的信息。
(3)HTTP響應
在接收和解釋請求消息後,服務器會返回一個HTTP響應消息。
與HTTP請求類似,HTTP響應也是由三個部分組成,分別是:狀態行,消息報頭,相應正文。
狀態行由協議版本,數字形式的狀態代碼,相應的狀態描述組成,各元素之間以空格分隔,除了結尾的CRLF(回車換行)序列外,不允許出現CR或LF字符。格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version表示服務器HTTP協議的版本,Status-Code表示服務器發回的響應代碼,Reason-Phrase表示狀態代碼的文本描述,CRLF表示回車換行。
Status-Code(狀態代碼):由三位數字組成,表示請求是否被理解或者滿足;
狀態代碼的第一個數字代表的響應的類別:
1xx:指示信息——表示請求已接收,繼續處理
2xx:成功——表示請求已經被成功接收,理解,接受
3xx:重定向——要完成請求必須進行更進一步的操作
4xx:客戶端錯誤——請求有語法錯誤或請求無法實現
5xx:服務器端錯誤——服務器未能實現合法的請求
Reason-Phrase(狀態描述):關於狀態代碼的簡短文本描述;
例如:
HTTP/1.1 200 OK (CRLF)