程式設計師都該懂點 HTTP

developerHaoz發表於2017-11-16

作者:developerHaoz
Github 地址:developerHaoz
說明:本文主要是對 HTTP 基礎知識進行總結和歸納,畢竟做 IT 的,網路這一塊還是很重要的

本文的主要內容

  • HTTP 是什麼
  • URL 詳解
  • HTTP 之請求篇
  • HTTP 之響應篇

一、HTTP是什麼

1、概述

HTTP 全稱是 HyperText Transfer Protocal ,即:超文字傳輸協議,從 1990 年開始就在 WWW 上廣泛應用,是現今在 WWW 上應用最多的協議,HTTP 是應用層協議,當你上網瀏覽網頁的時候,瀏覽器和 web 伺服器之間就會通過 HTTP 在 Internet 上進行資料的傳送和接收。HTTP 是一個基於請求/響應模式的、無狀態的協議。即我們通常所說的 Request/Response

2、特點

  • 支援客戶端/伺服器模式
  • 簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。由於 HTTP 協議簡單,使得 HTTP 伺服器的程式規模小,因而通訊速度很快
  • 靈活:HTTP 允許傳輸任意型別的資料物件。正在傳輸的型別由 Content-Type 加以標記
  • 無連線:無連線的含義是限制每次連結只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連結,採用這種方式可以節省傳輸時間
  • 無狀態:HTTP 協議是無狀態協議。無狀態是指協議對於事物處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能會導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就比較快

二、URL詳解

1、簡介

URL(Uniform Resource Locator)是統一資源定位符的簡稱,有時候也被俗稱為網頁地址(網址),如同是網路上的門牌,是因特網上標準的資源的地址

2、基本組成

通用的格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

名稱 功能
scheme 訪問伺服器以獲取資源時要使用哪種協議,比如,http,https 和 FTP 等
host HTTP 伺服器的 IP 地址或域名
port# HTTP 伺服器的預設埠是 80,這種情況下埠號可以省略,如果使用了別的埠,必須指明,例如www.cnblogs.com:8080
path 訪問資源的路徑
query-string 發給 http 伺服器的資料
anchor

舉個例子:
www.mywebsite.com/sj/test/tes…
其中

名稱 對應的欄位
Schema http
host www.mywebsite.com
path /js/test/test.aspx
Query-string name=sviergn&x=true
anchor stuff

再來張比較直觀的圖

URL 組成
URL 組成

三、HTTP 之請求篇

HTTP 的請求報文分為三個部分:請求行請求頭請求體

請求報文
請求報文

1、請求行

請求行(Request line)分為三個部分:請求方法請求地址協議版本

請求方法

HTTP/1.1 協議中共定義了八種方法(也叫“動作”)來以不同的方式操作指定的資源

方法名 功能
GET 向指定的資源發出“顯示”請求,使用 GET 方法應該只用在讀取資料上,而不應該用於產生“副作用”的操作中
POST 指定資源提交資料,請求伺服器進行處理(例如提交表單或者上傳檔案)。資料被包含在請求文字中。這個請求可能會建立新的資源或者修改現有資源,或兩者皆有。
PUT 向指定資源位置上傳其最新內容
DELETE 請求伺服器刪除 Request-URI 所標識的資源
OPTIONS 使伺服器傳回該資源所支援的所有HTTP請求方法。用*來代替資源名稱,向 Web 伺服器傳送 OPTIONS 請求,可以測試伺服器功能是否正常運作
HEAD 與 GET 方法一樣,都是向伺服器發出指定資源的請求,只不過伺服器將不傳回資源的本文部分,它的好處在於,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲取其中關於該資源的資訊(原資訊或稱後設資料)
TRACE 顯示伺服器收到的請求,主要用於測試或診斷
CONNECT HTTP/1.1 中預留給能夠將連線改為通道方式的代理伺服器。通常用於 SSL 加密伺服器的連結(經由非加密的 HTTP 代理伺服器)

其中,最常見的是 GET 和 POST 方法,如果是 RESful 介面的話一般會用到 PUT、DELETE、GET、POST(分別對應增刪查改),這裡附上一篇有關 REST 的文章 什麼是 REST

2、請求頭

請求頭可用於傳遞一些附加資訊,格式為:鍵: 值,注意冒號後面有一個空格

請求頭
請求頭

請求和響應常見通用的 Header

名稱 作用
Content-Type 請求體/響應體的型別,如:text/plain、application/json
Accept 說明接收的型別,可以多個值,用,(英文逗號)分開
Content-length 請求體/響應體的長度,單位位元組
Content-Encoding 請求體/響應體的編碼格式,如 gzip、deflate
Accept-Encoding 告知對方我方接受的 Content-Encoding
ETag 給當前資源的標識,和Last-ModifiedIf-None-MatchIf-Modified-Since配合,用於快取控制
Cache-Control 取值一般為no-cachemax-age=xx,xx為整數,表示資源快取有效期(秒)

常見的請求 Header

名稱 作用
Authorization 用於設定身份認證資訊
User-Agent 使用者標識,如:OS 和瀏覽器的型別和版本
If-Modified-Since 值為上一次伺服器返回的Last-Modified值,用於確定某個資源是否被更改過,沒有更改過就從快取中讀取
If-None-Match 值為上一次伺服器返回的 ETag 值,一般會和If-Modified-Since
Cookie 已有的Cookie
Referer 標識請求引用自哪個地址,比如你從頁面 A 跳轉到頁面 B 時,值為頁面 A 的地址
Host 請求的主機和埠號

請求體

請求體(又叫請求正文)是 post 請求方式中的請求引數,以 key = value 形式進行儲存,多個請求引數之間用&連線,如果請求當中請求體,那麼在請求頭當中的 Content-Length 屬性記錄的就是該請求體的長度

包含請求體的請求訊息
包含請求體的請求訊息

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

第一種:

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

HTTP請求,形式一
HTTP請求,形式一

第二種:

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

HTTP 請求,形式二
HTTP 請求,形式二

第三種:

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

HTTP 請求,形式三
HTTP 請求,形式三

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

四、HTTP 之響應篇

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

HTTP 響應報文
HTTP 響應報文

1、響應狀態行

狀態碼

狀態碼(就是上圖中的響應碼),如果想檢視各種狀態碼具體的含義,可以看一下這篇文章HTTP狀態碼對照表,當然這麼多狀態碼要想全部都記住的話,還是比較困難的。

在平時我們只要記住這些就差不多了

狀態碼 對應的資訊
1XX 提示資訊—表示請求已接收,繼續處理
2XX 用於表示請求已被成功接收、理解、接收
3XX 用於表示資源(網頁等)被永久轉移到其它 URL,也就是所謂的重定向
4XX 客戶端錯誤—請求有語法錯誤或者請求無法實現
5XX 伺服器端錯誤—伺服器未能實現合法的請求

2、響應頭

響應頭同樣可用於傳遞一些附加資訊

響應頭
響應頭

常見的響應 Header

名稱 作用
Date 伺服器的日期
Last-Modified 該資源最後被修改的時間
Transfer-Encoding 取值一般為 chunked,出現在 Content-Length 不能確定的情況下,表示伺服器不知道響應板體的資料大小,一般同時出現Content-Encoding響應頭
Set-Cookie 設定 Cookie
Location 重定向到另一個 URL,如輸入瀏覽器就輸入 baidu.com 回車,會自動跳轉到www.baidu.com 就是通過這個響應頭控制的
Server 後臺伺服器

3、響應體

響應體也就是網頁的正文內容,一般在響應頭中會用 Content-Length 來明確響應體的長度,便於瀏覽器接收,對於大資料量的正文資訊,也會使用 chunked 的編碼方式。


猜你喜歡

相關文章