你應該知道的HTTP基礎知識

你應該知道的HTTP基礎知識

本文主要內容:

  • HTTP請求報文格式
  • HTTP響應報文格式
  • Header
  • 請求體的3種形式
  • 推薦調試工具
  • HTTP的組成圖示

1. HTTP請求報文格式

HTTP 的請求報文分為三個部分 請求行請求頭請求體,格式如圖:

HTTP請求報文格式

註:部分文章也將HTTP請求報文分為兩部分請求頭和請求體,請求頭的第一行為請求行。

1.1 請求行

請求行(Request Line)分為三個部分:請求方法請求地址協議及版本,以CRLF(
)結束。

HTTP/1.1 定義的請求方法有8種:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的兩種GET和POST,如果是RESTful介面的話一般會用到GET、POST、DELETE、PUT。

在了解請求地址之前,先了解一下URL的構成:

URL.png

PATH是URL主機以後的部分,即包含了Query String,如:

請求報文示例:

HTTP請求報文格式示例

2. HTTP響應報文格式

HTTP響應的格式上除狀態行(第一行)與請求的請求行不一樣以外,其它就格式而言是一樣的,但排除狀態行和請求行的區別,從Header上還是能區分出HTTP請求和HTTP響應的,怎麼區分就要看前面的常見Header啦。

HTTP_響應

狀態碼(就是上圖中的響應碼) 的詳細可以查看 HTTP狀態碼詳解

為了更直觀的展示HTTP響應,下面的例子,自nc 1270.0.1:80 << EOF到EOF之間,是一個簡單的HTTP請求.

HTTP請求和響應

3. Header

Header可用於傳遞一些附加信息,格式: 鍵: 值,注意冒號後面有一個空格!如:

Content-Length: 1024Content-Type: text/plain3.1 請求和響應常見通用Header3.2 常見請求Header3.3 常見響應Header4. 請求體的3種形式

根據應用場景的不同,HTTP請求的請求體有三種不同的形式。

第一種:

移動開發者常見的,請求體是任意類型,伺服器不會解析請求體,請求體的處理需要自己解析,如 POST JSON時候就是這類。

HTTP請求,形式一

第二種:

第二種和第三種都有固定格式的,是伺服器端開發人員最先了解到的兩種。這裡的格式要求就是URL中Query String的格式要求:多個鍵值對之間用&連接,鍵與值之前用=連接,且只能用ASCII字元,非ASCII字元需使用UrlEncode編碼。

HTTP請求,形式二

第二種示例

第三種:

第三種請求體的請求體被分成為多個部分,文件上傳時會被使用,這種格式最先應該是被用於郵件傳輸中,每個欄位/文件都被boundary(Content-Type中指定)分成單獨的段,每段以-- 加 boundary開頭,然後是該段的描述頭,描述頭之後空一行接內容,請求結束的標製為boundary後面加--,結構見下圖:

HTTP請求,形式三

區分是否被當成文件的關鍵是Content-Disposition是否包含filename,因為文件有不同的類型,所以還要使用Content-Type指示文件的類型,如果不知道是什麼類型取值可以為application/octet-stream表示該文件是個二進位文件,如果不是文件則Content-Type可以省略。

下圖為一個帶有文件的上傳的請求體原文:

第三種請求體示例

注意:

第二、三種請求體需求配合特定的Content-Type請求頭,如:

第二種配合Content-Type:application/x-www-form-urlencoded

第三種配合Content-Type: multipart/form-data; boundary={boundary} ,

*上面的form-data也可以是mixed、alternative、digest、parallel,但我只用到了form-data

如果兩者沒有相配合,那麼伺服器不會解析請求體,也就是說只會當成第一種情況!

表單或者模擬表單 指的就是第二種和第三種(multipart/form-data)

5. 推薦調試工具5.1 cURL

cURL 相當強大命令行工具,基本上你知道的上層協議它都支持,具體使用方法就自行發現了,下圖為發起一個HTTP GET請求並列印請求和響應的詳細內容。

cURL截圖

5.2 bat

bat 是astaxie(謝孟軍) 用Golang開發的類似cURL的命令行API調試工具,可以方便的列印出HTTP請求和響應,還能高亮Header、格式化JSON等功能,非常好用,API調式神器。

bat截圖

5.3 nc

nc 是 netcat 的簡寫,被稱為「網路工具中的瑞士軍刀」,不過我個人是把它當成Socket用,經常使用它來列印各種請求,當然它的作用可不只是這樣,你也可以用它發起各式各樣的請求,以前調式POP3也是用的它,只不過請求報文得自己寫,上面有個圖「HTTP請求和響應」就是用nc完成的。

6. HTTP的組成圖示

感覺寫得有點亂,如果按下圖的結構寫會不會更好呢?

HTTP報文組成.png

推薦閱讀:

一文看懂AI晶元競爭五大維度
筆記 - TensorFlow模型的跨平台部署(三)
迷宮 待添加
2018年6月 Top 10 機器學習開源項目
昆士蘭大學計算機類課程&詳細申請信息

TAG:Web應用 | 計算機科學 |