了解HTTP Headers的方方面面(2)

HTTP Request 的結構

被稱作「first line」的第一行包含三個部分:

  • 「method」 表明這是何種類型的請求. 最常見的請求類型有 GET, POST 和 HEAD.
  • 「path」 體現的是主機之後的路徑. 例如,當你請求 「http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/」時 , path 就會是 「/tutorials/other/top-20-mysql-best-practices/」.
  • 「protocol」 包含有 「HTTP」 和版本號, 現代瀏覽器都會使用1.1.
  • 剩下的部分每行都是一個「Name:Value」對。它們包含了各式各樣關於請求和你瀏覽器的信息。例如」User-Agent「就表明了你瀏覽器版本和你所用的操作系統。」Accept-Encoding「會告訴伺服器你的瀏覽可以接受類似gzip的壓縮輸出。

    這些headers大部分都是可選的。HTTP 請求甚至可以被精簡成這樣子:

    GET/tutorials/other/top-20-mysql-best-practices/HTTP/1.1Host:net.tutsplus.com

    並且你仍舊可以從伺服器收到有效的響應。

    請求類型

    三種最常見的請求類型是:GET,POST 和 HEAD ,從html的編寫過程中你可能已經熟悉了前兩種。

    GET:獲取一個文檔

    大部分被傳輸到瀏覽器的html,images,js,css, … 都是通過GET方法發出請求的。它是獲取數據的主要方法。

    例如,要獲取Nettuts+ 的文章,http request的第一行通常看起來是這樣的:

    GET/tutorials/other/top-20-mysql-best-practices/HTTP/1.1

    一旦html載入完成,瀏覽器將會發送GET 請求去獲取圖片,就像下面這樣:

    GET/wp-content/themes/tuts_theme/images/header_bg_tall.pngHTTP/1.1

    表單也可以通過GET方法發送,下面是個例子:

    <form action="foo.php" method="GET">First Name: <input name="first_name" type="text" />Last Name: <input name="last_name" type="text" /><input name="action" type="submit" value="Submit" /></form>

    當這個表單被提交時,HTTP request 就會像這樣:

    GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1...

    你可以將表單輸入通過附加進查詢字元串的方式發送至伺服器。

    POST:發送數據至伺服器

    儘管你可以通過GET方法將數據附加到url中傳送給伺服器,但在很多情況下使用POST發送數據給伺服器更加合適。通過GET發送大量數據是不現實的,它有一定的局限性。

    用POST請求來發送表單數據是普遍的做法。我們來吧上面的例子改造成使用POST方式:

    <form action="foo.php" method="POST">First Name: <input name="first_name" type="text" />Last Name: <input name="last_name" type="text" /><input name="action" type="submit" value="Submit" /></form>

    提交這個表單會創建一個如下的HTTP 請求:

    POST /foo.php HTTP/1.1Host: localhostUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-us,en;q=0.5Accept-Encoding: gzip,deflateAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Keep-Alive: 300Connection: keep-aliveReferer: http://localhost/test.phpContent-Type: application/x-www-form-urlencodedContent-Length: 43first_name=John&last_name=Doe&action=Submit

    這裡有三個需要注意的地方:

  • 第一行的路徑已經變為簡單的 /foo.php , 已經沒了查詢字元串。
  • 新增了 Content-Type 和 Content-Lenght 頭部,它提供了發送信息的相關信息.
  • 所有數據都在headers之後,以查詢字元串的形式被發送.
  • POST方式的請求也可用在AJAX,應用程序,cURL … 之上。並且所有的文件上傳表單都被要求使用POST方式。

    HEAD:接收頭部信息

    HEAD和GET很相似,只不過HEAD不接受HTTP響應的內容部分。當你發送了一個HEAD請求,那就意味著你只對HTTP頭部感興趣,而不是文檔本身。

    這個方法可以讓瀏覽器判斷頁面是否被修改過,從而控制緩存。也可判斷所請求的文檔是否存在。

    例如,假如你的網站上有很多鏈接,那麼你就可以簡單的給他們分別發送HEAD請求來判斷是否存在死鏈,這比使用GET要快很多。


    推薦閱讀:

    Go Programming Language http
    特殊的Http請求multipart
    前端工程師應該對 HTTP 了解到什麼程度?從哪些途徑去熟悉更好?
    大誤-用FreeBSD的ports安裝apache+php+mysql
    共用的抽象模型(客戶及伺服器端)- (編集/反編集)過程

    TAG:HTTP | 了解 | 面面 | 方方 |