HTTP請求與響應

HTTP請求與響應

最權威的文檔html

https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html跨域

然而閱讀起來難度有點大呢
因此能夠看看HTTP權威指南 以及圖解HTTP(很好的入門書)數組

header & body

一個HTTP請求 是由請求頭和請求體組成的 不過呢GET請求是沒有請求體的 POST纔有瀏覽器

一個請求/響應的大體結構:
header(包括請求行 請求首部字段 通用首部字段 實體首部字段)
空行(CR+LF)
body
enter image description here緩存

一個GET請求服務器

GET /books/?name=Professional%20Ajax HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Aliveapp

一個純文本的POST請求測試

POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
(此處空一行)
name=Professional%20Ajax&publisher=Wiley編碼

發送圖片等二進制數組的POST請求加密

POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryPh3G5pOw90P9pzQW
Content-Length: 35827
Connection: Keep-Alive

------WebKitFormBoundaryPh3G5pOw90P9pzQW
Content-Disposition: form-data; name="file"; filename="2015-11-20 235622.jpg"
Content-Type: image/jpeg

------WebKitFormBoundaryPh3G5pOw90P9pzQW--

一個響應

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
(此處空一行)
<html>
....

HTTP Action

  • OPTIONS
    這個方法可以使服務器傳回該資源所支持的全部HTTP請求方法。好比服務器會返回這麼一個Allow字段
Allow: GET, POST, PUT, OPTIONS
  • GET/POST
  • HEAD
    與GET方法同樣,都是向服務器發出指定資源的請求。只不過服務器將不傳回資源的實體部分。它的好處在於,使用這個方法能夠在沒必要傳輸所有內容的狀況下,就能夠獲取其中「關於該資源的信息」(對象是否存在 對象的類型 對象是否被修改)。
  • PUT
    POST用於向服務器發送數據 PUT用於向服務器上的文件中存儲數據
  • DELETE
    請求服務器刪除Request-URI所標識的資源。
  • TRACE
    回顯服務器收到的請求,主要用於測試或診斷。由於客戶端發出的請求會通過防火牆 代理 網關等 期間請求可能被修改 有了TRACE就能夠看到請求是如何被修改的
  • CONNECT
    CONNECT:HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。一般用於SSL加密服務器的連接(經由非加密的HTTP代理服務器)。

PS 這些Action並非所有 還有一些擴展的方法

響應狀態碼

200 請求成功 響應有響應體
204 請求成功處理 可是返回的報文不包括body
206 Partical Content 響應的報文中包含了Content-Range指定的範圍實體內容
301 永久移動 表示資源已經被從新分配了URI
302 臨時移動 臨時移動並非說資源暫時移至別處後會回到原來的位置 實際意思是雖然資源分配了新的URI 可是這個URI仍是會改變的額
303 和302同樣 可是303表示客戶端應當使用GET
304 當客戶端發送了附帶條件的請求的時候 服務端運算後發現條件不成立 返回304 (條件不成立表示服務器的資源沒有更新 可使用緩存) 返回304的時候不包括響應體
條件請求 If-Match If-Modifiled-Since If-None-Match If-Range If-Unmodified-Since
307 臨時重定向 和302相似 可是302規定禁止從POST變成GET
400 Bad Request 報文存在語法錯誤
401 未受權 此時瀏覽器會彈出一個框要求輸入用戶名和密碼
403 禁止訪問這個資源(從未受權的IP地址發出的訪問)
404
500
503 服務器超負載狀態 或者處於停機維護

PS URL是URI(統一資源標識符)的子集
好比下面也都是URI

mailto:xxx@xx.com
temlnet://xx.xx.xx.xx:80/

MIME類型

Web服務器能夠用文件的擴展名來講明MIME的類型

請求和響應中的字段

通用首部

請求和響應都有的字段 (HTTP權威指南71頁)

首部字段名 說明
Cache-Control 控制緩存行爲
Connection 容許客戶端和服務器指定與請求響應鏈接有關選項
Date HTTP報文建立時間
Pragma Cache-Control的HTTP1.0兼容
Trailer ..
Transfer-Encoding 報文編碼方式
Upgrade ..
Via 報文通過的中間節點

請求首部

首部字段名 說明
Accept 用戶代理可處理的媒體類型
Accept-Charset 優先的字符集
Accept-Encoding 優先的內容編碼
Accept-Language 用戶語言
Authorization Web認證信息
Except 期待服務器的特定行爲
HOST 給出了接收請求的服務器的主機名和端口號
If-Match 比較實體標記Etag
If-Modified-Since 比較資源更新時間
If-Unmodified-Since If-Modified-Since相反
If-None-Match 和If-Match相反
Max-Forwards 最大傳輸跳數
Proxy-Authorization 代理服務器認證信息
Range 實體範圍請求
If-Range 資源未更新時 發送實體範圍請求 單位是Byte
Referer URI來源
TE 傳輸編碼優先級
User-Agent HTTP客戶端信息

響應首部

首部字段名 說明
Accept-Ranges 是否接受字節範圍的請求
Age 原服務器建立響應後到如今通過的時間 單位爲秒
Etag 資源的信息
Location 重定向URI
Proxy-Authenticate 代理服務器與客戶端的認證信息
Retry-After 若是資源不可用的話,在此日期或時間重試
Server 服務器應用程序軟件的名稱和版本
WWW-Authenticate 服務器和客戶端的認證信息

實體首部

首部字段名 說明
Allow 該資源能夠支持的HTTP方法或其餘 好比是否容許跨域
Content-Type 實體媒體類型
Content-Location
Content-Length
Content-Language
Content-MD5
Expires 過時時間
Last-Modified 最後修改時間

緩存

在規定時間內 都認爲內容是新鮮的 緩存能夠任意使用這些副本 無需和服務器聯繫

Expires: Sat, 29 June 2002, 14:30:00 GMT
OR
Cache-Control: max-age=43220

max-age表示從服務器響應的時候開始 此資源處於新鮮狀態的時間長度

PS
Cache-Control是HTTP1.1中才有的 Expires是HTTP1.0就有

304

僅僅是資源超過了規定時間可是並不意味着服務器上的資源更新了
HTTP向原始服務器發送一個條件GET 服務器自行判斷 在緩存資源和服務器中的資源不一樣的時候才返回對象 (這個時候纔有響應體)
這也就是常說的條件GET 只有條件成立 服務器才返回對象 不成立 則返回304

最經常使用的是 If-Modified-Since 和 If-None-Match
在GET請求資源的時候降入這個首部
請求

If-Modified-Since: Sat, 29 June 2002, 14:30:00 GMT
If-None-Match: <tags>

響應

HTTP/1.0  304 Not Modified
Date: Wed, 03 Jul 2002, 19:22:00 GMT
Expires: Fri, 05 Jul 2002, 19:22:00 GMT

那麼If-Modified-Since發送的時間到底是何時呢
一般是和 Last-Modefied 這個響應的首部 配合
一個資源第一次請求 服務器的響應包含了Last-Modefied的話
下一次再次發送請求就會有If-Modified-Since 字段 , 值就是Last-Modefied的值

If-None-Match也是一樣道理 配合服務器響應的Etag首部
Etag是文件的標識, 標識規則是服務器來肯定, 因此要發送的If-None-Match的值也就是
該資源第一次請求服務器響應的Etag值

PS 若是響應中既有Last-Modefied 和 Etag 只有二者都知足的時候才返回304

相關文章
相關標籤/搜索