1. 程式人生 > >HTTP請求與響應以及CURL命令

HTTP請求與響應以及CURL命令

一.HTTP請求訊息

客戶端傳送一個HTTP請求到伺服器的請求訊息包括以下四個部分:

第一部分:請求行,用來說明請求型別,要訪問的資源以及所使用的HTTP版本號。

例如:

GET /101.jpg HTTP/1.1

常用的請求命令有:GET、POST、HEAD、PUT、DELETE、TRACE、OPTION、CONNECT。

  1. GET方法
    GET方法用來向伺服器請求指定的資源,它是全球資訊網中資訊檢索的主要方式。當伺服器收到一個GET請求後,它會將所請求的資源內容放到響應體中,客戶端收到GET響應後,根據頭域中的一些資訊,對響應體進行解析,從而得到所需要的資源。

  2. HEAD方法
    HEAD方法用來請求資源的相關屬性,而非資源本身,HEAD方法的響應訊息中沒有響應體。對HEAD請求,伺服器需要保證對同一個URI,HEAD請求的響應內容和GET請求的響應內容去掉響應體後完全相同。HEAD方法用來請求資源的相關屬性,而非資源本身,HEAD方法的響應訊息中沒有響應體。對HEAD請求,伺服器需要保證對同一個URI,HEAD請求的響應內容和GET請求的響應內容去掉響應體後完全相同。
    在協議文件中沒有對GET和HEAD請求中請求體的語義作出定義,為GET和HEAD請求新增請求體是允許的,但由於語義上未定義,所以伺服器實現時有可能會直接將其丟棄,或拒絕連線,這取決於服務端的實現和配置。參見文章HTTP GET with request body。
    GET和HEAD請求都是可快取的,對GET請求的快取可以在隨後的GET和HEAD請求中使用,而對HEAD請求的快取則只能在隨後的HEAD請求中使用。此外,如果已有GET請求的快取,但快取已過期,或強制指定HEAD請求不使用快取,則收到的HEAD請求的響應訊息可能會被用來驗證或更新之前的GET請求的快取。

  3. POST方法
    POST方法用於將請求報文中的訊息體messagePOST方法用於將請求報文中的訊息體message
    body提交給伺服器,請求目標資源對訊息體內容進行相應處理,這通常會導致伺服器上的狀態發生變化。

    常見的POST方法的使用場景有:
    1.提供一塊資料,例如一組HTML表單資料,供伺服器處理。
    2.在BBS,blog,新聞組等網路系統中釋出文章或資訊。
    3.在伺服器上建立新的資源物件。向已有的資源中新增新的資料。

    一般來說POST方法的響應訊息是不被UA快取的,除非伺服器在響應訊息中明確指定有效期(Freshness Lifetime)資訊(表示伺服器明確希望這條響應訊息被UA快取),但即使在響應訊息中附帶了有效期,也不能保證一定會被客戶端快取,因為POST快取並未普遍實現。

  4. PUT方法
    PUT方法用於將請求報文中的訊息體message用於將請求報文中的訊息體message
    body提交給伺服器,請求伺服器建立一個新的目標資源,或者替換原先的目標資源。當一個PUT請求被成功執行後,意味著使用同樣的請求URI執行GET請求,在響應訊息體中會得到和原先PUT請求中訊息體的等價表示。但是,不能保證這種狀態變化是可觀察的,因為在接收到任何後續GET之前,目標資源可能已經會被其他UA執行的請求所修改,或者之前PUT請求所需要的修改正在被伺服器處理但還沒有完成,因為UA收到PUT方法的成功響應僅僅表示本次請求的意圖已經被伺服器接受,但並不代表伺服器已經完成了資源建立或替換的工作。

  5. DELETE方法
    DELETE方法用來請求源伺服器刪除目標資源與其當前功能之間的聯絡。

  6. PATH方法
    PATCH方法用於對資源進行部分修改。由於PATCH不是標準的HTTP方法,所以不能保證客戶端和服務端都已經實現。例如,在JDK中HttpURLConnection類就不支援將請求方法設定為PATCH。

第二部分:請求頭部,緊接著請求行(即第一行)之後的部分,用來說明伺服器要使用的附加資訊

從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,伺服器端和客戶端指令碼都能訪問它,它是瀏覽器型別檢測邏輯的重要基礎.該資訊由你的瀏覽器來定義,並且在每個請求中自動傳送等等
例如:

Host: blog.csdn.net
Connection: keep-alive
Cache-Control: max-age=0

第三部分:空行

空行用來區分第二部分和第四部分,即使第四部分無內容,第三部分也必須空行。

第四部分:請求資料

伺服器返回給客戶端的文字資訊。

二.HTTP之響應訊息

一般情況下,伺服器接收並處理客戶端發過來的請求後會返回一個HTTP的響應訊息。HTTP響應也由四個部分組成,分別是:狀態行、訊息報頭、空行和響應正文。

第一部分:狀態行。由HTTP協議版本號, 狀態碼, 狀態訊息 三部分組成。

例如:

HTTP/1.1 200 OK

(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態訊息為(ok)

常見的狀態碼有:

  1. 1XX開頭
    1xx(臨時響應)表示臨時響應並需要請求者繼續執行操作的狀態程式碼。程式碼 說明
    100 (繼續 ) 請求者應當繼續提出請求。 伺服器返回此程式碼表示已收到請求的第一部分,正在等待其餘部分。
    101 (切換協議) 請求者已要求伺服器切換協議,伺服器已確認並準備切換。
  2. 2XX開頭
    2xx (成功)表示成功處理了請求的狀態程式碼。程式碼 說明
    200 (成功) 伺服器已成功處理了請求。 通常,這表示伺服器提供了請求的網頁。
    201 (已建立) 請求成功並且伺服器建立了新的資源。
    202 (已接受) 伺服器已接受請求,但尚未處理。
    203 (非授權資訊) 伺服器已成功處理了請求,但返回的資訊可能來自另一來源。
    204 (無內容) 伺服器成功處理了請求,但沒有返回任何內容。
    205 (重置內容) 伺服器成功處理了請求,但沒有返回任何內容。
    206 (部分內容) 伺服器成功處理了部分 GET 請求。
  3. 3XX開頭
    3xx (重定向) 表示要完成請求,需要進一步操作。 通常,這些狀態程式碼用來重定向。程式碼 說明
    300 (多種選擇) 針對請求,伺服器可執行多種操作。 伺服器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。
    301 (永久移動) 請求的網頁已永久移動到新位置。 伺服器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
    302 (臨時移動) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。
    303 (檢視其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,伺服器返回此程式碼。
    304 (未修改) 自從上次請求後,請求的網頁未修改過。 伺服器返回此響應時,不會返回網頁內容。
    305 (使用代理) 請求者只能使用代理訪問請求的網頁。 如果伺服器返回此響應,還表示請求者應使用代理。
    307 (臨時重定向) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。
  4. 4XX開頭
    4xx(請求錯誤) 這些狀態程式碼表示請求可能出錯,妨礙了伺服器的處理。程式碼 說明
    400 (錯誤請求) 伺服器不理解請求的語法。
    401 (未授權) 請求要求身份驗證。 對於需要登入的網頁,伺服器可能返回此響應。
    403 (禁止) 伺服器拒絕請求。
    404 (未找到) 伺服器找不到請求的網頁。
    405 (方法禁用) 禁用請求中指定的方法。
    406 (不接受) 無法使用請求的內容特性響應請求的網頁。
    407 (需要代理授權) 此狀態程式碼與 401(未授權)類似,但指定請求者應當授權使用代理。
    408 (請求超時) 伺服器等候請求時發生超時。
    409 (衝突) 伺服器在完成請求時發生衝突。 伺服器必須在響應中包含有關衝突的資訊。
    410 (已刪除) 如果請求的資源已永久刪除,伺服器就會返回此響應。
    411 (需要有效長度) 伺服器不接受不含有效內容長度標頭欄位的請求。
    412 (未滿足前提條件) 伺服器未滿足請求者在請求中設定的其中一個前提條件。
    413 (請求實體過大) 伺服器無法處理請求,因為請求實體過大,超出伺服器的處理能力。
    414 (請求的 URI 過長) 請求的 URI(通常為網址)過長,伺服器無法處理。
    415 (不支援的媒體型別) 請求的格式不受請求頁面的支援。
    416 (請求範圍不符合要求) 如果頁面無法提供請求的範圍,則伺服器會返回此狀態程式碼。
    417 (未滿足期望值) 伺服器未滿足"期望"請求標頭欄位的要求。
  5. 5XX開頭
    5xx(伺服器錯誤)這些狀態程式碼表示伺服器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是伺服器本身的錯誤,而不是請求出錯。程式碼 說明
    500 (伺服器內部錯誤) 伺服器遇到錯誤,無法完成請求。
    501 (尚未實施) 伺服器不具備完成請求的功能。 例如,伺服器無法識別請求方法時可能會返回此程式碼。
    502 (錯誤閘道器) 伺服器作為閘道器或代理,從上游伺服器收到無效響應。
    503 (服務不可用) 伺服器目前無法使用(由於超載或停機維護)。 通常,這只是暫時狀態。
    504 (閘道器超時) 伺服器作為閘道器或代理,但是沒有及時從上游伺服器收到請求。
    505 (HTTP 版本不受支援) 伺服器不支援請求中所用的 HTTP 協議版本。
第二部分:訊息報頭,用來說明客戶端要使用的一些附加資訊

例如:

Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

第三部分:空行
第四部分:相應正文,伺服器返回給客戶端的文字資訊

例如:

三、CURL命令

curl是一個利用URL規則在命令列下工作的檔案傳輸工具,可以說是一款很強大的http命令列工具。它支援檔案的上傳和下載,是綜合傳輸工具。

  1. 基本用法
# curl http://www.linux.com

執行後,百度的html就會顯示在螢幕上了

  1. 儲存訪問的網頁
$ curl -o linux.html http://www.baidu.com
  1. 測試網頁返回值
# curl -o /dev/null -s -w %{http_code} www.baidu.com

常見引數:

-A/–user-agent 設定使用者代理髮送給伺服器
-b/–cookie <name=string/file> cookie字串或檔案讀取位置
-c/–cookie-jar 操作結束後把cookie寫入到這個檔案中
-C/–continue-at 斷點續轉
-D/–dump-header 把header資訊寫入到該檔案中
-e/–referer 來源網址
-f/–fail 連線失敗時不顯示http錯誤
-o/–output 把輸出寫到該檔案中
-O/–remote-name 把輸出寫到該檔案中,保留遠端檔案的檔名
-r/–range 檢索來自HTTP/1.1或FTP伺服器位元組範圍
-s/–silent 靜音模式。不輸出任何東西
-T/–upload-file 上傳檔案
-u/–user <user[:password]> 設定伺服器的使用者和密碼
-w/–write-out [format] 什麼輸出完成後
-x/–proxy <host[:port]> 在給定的埠上使用HTTP代理
-#/–progress-bar 進度條顯示當前的傳送狀態