網(wǎng)絡(luò)原理1.HTTP協(xié)議詳解

一. 什么是HTTP協(xié)議

  1. HTTP協(xié)議是Hypertext Transfer Protocol(超文本傳輸協(xié)議)的縮寫(xiě)
  2. 主要用于World Wide Web(萬(wàn)維網(wǎng))與瀏覽器之間傳輸超文本數(shù)據(jù)
  3. 可以傳輸各種格式的數(shù)據(jù),例如圖片,文本,附件等等
  4. 基于TCP/IP通信協(xié)議來(lái)傳輸數(shù)據(jù)

二. 工作方式

http_request_response.png

主要方式客戶端-服務(wù)器模式

  1. 首先客戶端發(fā)起一個(gè)http請(qǐng)求(request)報(bào)文
  2. 服務(wù)器回復(fù)一個(gè)響應(yīng)(response)報(bào)文

三. URI和URL

  1. URI(Uniform Resource Identifier)統(tǒng)一資源標(biāo)識(shí)符
  2. URL(Uniform Resource Locator)統(tǒng)一資源定位符
  3. URL是一種特殊的URI
  4. URL中包含了資源的請(qǐng)求方式和獲取方法,而URI可以不包含
  5. URL的組成部分:protocol://hostname[:port]/path
    • protocol:協(xié)議,例如http,ftp等等
    • hostname:主機(jī)名,例如IP端口或者域名
    • port:端口,可以為空
    • path:路徑,使用"/"分隔開(kāi)
    • 例如: http://www.baidu.com/

四. 請(qǐng)求方式

HTTP常用的請(qǐng)求方式有五種

  1. GET, 主要用于獲取資源
  2. POST, 主要用于添加資源
  3. PUT, 主要用于更新資源
  4. DELETE, 主要用于刪除資源
  5. OPTIONS, 和GET方式類(lèi)似, 主要用于獲取資源支持的HTTP請(qǐng)求方法
  6. GET和POST的區(qū)別:
    • 協(xié)議層面只有語(yǔ)義上的不同
    • 瀏覽器
      • GET方式把參數(shù)拼接在URL后面,并且有長(zhǎng)度限制
      • POST方式把參數(shù)放在body中,理論上沒(méi)有長(zhǎng)度限制

五. 報(bào)文結(jié)構(gòu)

HTTP報(bào)文主要有request和response兩種

1.request報(bào)文結(jié)構(gòu)

http request
  1. 請(qǐng)求行(request line): 包括請(qǐng)求方法,資源的URL,以及HTTP協(xié)議版本
  2. 請(qǐng)求頭部(header): 包括請(qǐng)求服務(wù)器所需要的附加信息
  3. 空行(CRLF):請(qǐng)求頭部后面必須是空行,即使請(qǐng)求數(shù)據(jù)為空,也要有空行
  4. 請(qǐng)求數(shù)據(jù)(body):也稱為請(qǐng)求實(shí)體,可以添加任意類(lèi)型的數(shù)據(jù)

2.response報(bào)文結(jié)構(gòu)

http response
  1. 狀態(tài)行(status line): 包括HTTP協(xié)議版本,狀態(tài)碼和狀態(tài)消息組成
  2. 消息報(bào)頭(header): 包括返回客戶端的一些附件信息
  3. 空行(CRLF): 必須有空行
  4. 響應(yīng)正文(body): 服務(wù)器返回給客戶端的數(shù)據(jù),可以是任意類(lèi)型的數(shù)據(jù)

六.HTTP請(qǐng)求響應(yīng)DEMO

1. GET方式

Request請(qǐng)求
GET /test?name=ygxing HTTP/1.1 
Connection: keep-alive 
Host: www.client.com 
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_151) 

Response請(qǐng)求
HTTP/1.1 200  
Server: nginx/1.12.2 
Date: Wed, 14 Mar 2018 01:33:03 GMT 
Content-Type: application/json;charset=UTF-8 
Content-Length: 44 
Proxy-Connection: Keep-alive 
 
{"status":1,"message":"success","data":null} 

2.POST方式

Request請(qǐng)求
POST /test/ HTTP/1.1 
Connection: keep-alive 
Content-Type: application/json 
Accept: application/json 
Content-Length: 25 
Host: www.client.com 
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_151) 
 
{"reports":["124","678"]} 
Response請(qǐng)求
HTTP/1.1 200  
Server: nginx/1.12.2 
Date: Wed, 14 Mar 2018 00:52:07 GMT 
Content-Type: application/json;charset=UTF-8 
Content-Length: 44 
Proxy-Connection: Keep-alive 
 
{"status":1,"message":"success","data":null} 

3.OPTIONS方式

Request請(qǐng)求
GET /test?name=ygxing HTTP/1.1 
Connection: keep-alive 
Host: www.client.com 
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_151) 

Response請(qǐng)求
HTTP/1.1 200  
Server: nginx/1.12.2 
Date: Wed, 14 Mar 2018 00:55:21 GMT 
Content-Length: 0 
Allow: GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS 
Proxy-Connection: Keep-alive

七.常用的HTTP消息頭

消息頭分為通用頭(請(qǐng)求和響應(yīng)共有的頭部),請(qǐng)求頭和響應(yīng)頭

1. 通用頭

協(xié)議頭 作用 示例
Cache-Control 指定請(qǐng)求和響應(yīng)需要遵循的緩存機(jī)制 Cache-Control:public,max-age=3600000
Connection 是否需要持久化連接 Connnection:keep-alive或者Connection:Upgrade
Date 消息發(fā)送的GMT時(shí)間 Date: Tue, 04 Jun 2019 10:33:56 GMT
Pragma HTTP1.0協(xié)議中,該首部依賴于具體實(shí)現(xiàn),向后兼容只支持緩存 Pragma:no-cache
Proxy-Authorization 向代理服務(wù)器進(jìn)行身份認(rèn)證 Proxy-Authorization:Bearer 123456
Transfer-Encoding 內(nèi)容編碼方式,可以和Content-Encoding配合使用,也可以分塊傳輸 Transfer-Encoding:chunked
Upgrade 要求客戶端或者服務(wù)器升級(jí)到另一個(gè)高版本協(xié)議 Upgrade:websocket
Via 主要由代理服務(wù)器操作,表示請(qǐng)求或者響應(yīng)經(jīng)過(guò)了哪些代理服務(wù)器 Via: 1.0 fred, 1.1 p.example.net
Warning 警告,其中會(huì)包含錯(cuò)誤碼,實(shí)體內(nèi)容可能存在錯(cuò)誤 Warning: 112 - "cache down" "Wed, 21 Oct 2015 07:28:00 GMT"

2. 請(qǐng)求頭

協(xié)議頭 作用 示例
Accept 客戶端可以接受的響應(yīng)內(nèi)容類(lèi)型 Accept:text/html
Accept-Charset 客戶端可接受的字符編碼方式 Accept-Charset:utf-8
Accept-Control-Request-Headers 預(yù)檢請(qǐng)求,告訴服務(wù)器真正請(qǐng)求使用的請(qǐng)求頭 Access-Control-Request-Headers: X-Custom-Header, Content-Type
Accept-Control-Request-Method 預(yù)檢請(qǐng)求,告訴服務(wù)器真正請(qǐng)求使用的方法 Access-Control-Request-Method: POST
Accept-Encoding 客戶端可接受的內(nèi)容編碼方式,可以和Content-Encoding配合使用 Accept-Encoding:deflate,gzip;q=1.0
Accept-Language 客戶端可接受的響應(yīng)內(nèi)容語(yǔ)言列表 Accept-Language:zh-cn
Authorization 客戶端攜帶的認(rèn)證信息 Bearer:xxxxxx
Cookie 客戶端攜帶的Cookie數(shù)據(jù),使用了session的話會(huì)攜帶一個(gè)SessionID Cookie:jsessionid=xxxx
Content-Security-Policy 資源安全策略,可以控制資源的訪問(wèn)安全 Content-Security-Policy: default-src https:
Content-Type 請(qǐng)求體的MIME類(lèi)型 Content-Type:application/json
Expect 客戶端要求服務(wù)器做出的特定的行為 Except:100-continue
Host 請(qǐng)求的服務(wù)器的IP和端口 Host:127.0.0.1:8080
If-Match 與ETag配合使用,當(dāng)客戶端提供的實(shí)體與服務(wù)器響應(yīng)Etag相匹配時(shí),才進(jìn)行相應(yīng)的操作,主要用于PUT請(qǐng)求 If-Match:123456
If-Modified-Since 配合ETag使用,如果資源在指定時(shí)間之前未經(jīng)修改,返回一個(gè)沒(méi)有body的304響應(yīng),如果資源在指定時(shí)間之前被修改,才會(huì)回復(fù)一個(gè)狀態(tài)碼為200并且攜帶資源的響應(yīng) If-Modified-Since:Wed, 05 Jun 2019 03:03:25 GMT
If-None-Match 配合ETag使用,如果資源ETag不匹配,服務(wù)器才返回請(qǐng)求的資源,響應(yīng)碼為200,如果資源ETag匹配,服務(wù)器響應(yīng)碼為304 If-None-Match:123456
If-Range 規(guī)定了Range字段生效的條件,滿足條件時(shí),服務(wù)器響應(yīng)碼為206,返回部分資源,不滿足條件時(shí),服務(wù)器響應(yīng)碼為200,返回完整資源 If-Range:Wed, 21 Oct 2015 07:28:00 GMT
If-Unmodified-Since 配合ETag使用,如果資源從指定時(shí)間起未被修改,那么服務(wù)器返回完整資源 If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT
Max-Forwards 限制請(qǐng)求消息可以被網(wǎng)關(guān)轉(zhuǎn)發(fā)的次數(shù) Max-Forwards: 10
Origin 請(qǐng)求的來(lái)源,只包含服務(wù)器的Host,不包含路徑 Origin: http://www.client.com
Range 配合If-Range使用,滿足If-Range條件時(shí),返回部分資源 Range:bytes=500-900
Referer 瀏覽器所訪問(wèn)的前一個(gè)頁(yè)面 Referer:http://www.client.com/index.html
TE 指定用戶代理希望使用的傳輸編碼類(lèi)型 TE: trailers, deflate;q=0.5
User-Agent 瀏覽器的身份標(biāo)識(shí)字符串 User-Agent:Mozilla/...
X-Requested-With 判斷客戶端的請(qǐng)求是ajax還是其他請(qǐng)求 X-Requested-With:"XMLHttpRequest"

3. 響應(yīng)頭

協(xié)議頭 作用 示例
Access-Control-Allow-Credentials 主要用戶解決跨域問(wèn)題,允許瀏覽器發(fā)送驗(yàn)證信息,例如Cookie,Authorization Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers 用于預(yù)檢請(qǐng)求,返回的是正式請(qǐng)求有哪些頭部 Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Alllow-Methods 用于預(yù)檢請(qǐng)求,返回服務(wù)器支持的方法列表 Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Origin 允許哪些Origin跨域共享資源 Access-Control-Allow-Origin:*
Access-Control-Expose-Headers 列出服務(wù)器支持的非簡(jiǎn)單響應(yīng)頭 Access-Control-Expose-Headers: Content-Length, X-Custom-Header
Accept-Patch 指定服務(wù)器所支持的文檔補(bǔ)丁格式 Accept-Patch:text/properties;charset=utf-8
Accept-Range 表示自身支持的請(qǐng)求范圍 Accept-Ranges: bytes
Age 響應(yīng)對(duì)象在代理服務(wù)器緩存的時(shí)間(單位:秒) Age: 600
Allow 資源支持的請(qǐng)求方式 Allow:GET,POST,HEAD
Content-Disposition 瀏覽器對(duì)于響應(yīng)資源的動(dòng)作,下載或者打開(kāi) Content-Disposition: attachment; filename="filename.jpg"
Content-Encoding 響應(yīng)數(shù)據(jù)的編碼方式,客戶端通過(guò)相應(yīng)的方式解碼,才能獲取在Content-Type中標(biāo)識(shí)的媒體類(lèi)型 Content-Encoding: gzip
Content-Language 響應(yīng)內(nèi)容所使用的語(yǔ)言 Content-Language:zh-cn,en-US
Content-Length 響應(yīng)數(shù)據(jù)的大小(單位字節(jié)) Content-Length:200
Content-Location 響應(yīng)資源的候選位置 Content-Location:/test/
Content-Range 響應(yīng)資源在整個(gè)文件中的位置 Content-Range: bytes 200-1000/67589
Content-Type 響應(yīng)資源的類(lèi)型 Content-Type: text/html; charset=utf-8
ETag 響應(yīng)資源版本的標(biāo)識(shí),主要用于緩存 ETag: "123456"
Expires 指定資源緩存超時(shí)日期 Expires: Wed, 21 Oct 2015 07:28:00 GMT
Strict-Transport-Security 瀏覽器跳轉(zhuǎn)到https Strict-Transport-Security: max-age=31536000; includeSubDomains
Last-Modified 上次修改時(shí)間 Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
Location 瀏覽器自動(dòng)重定向到Location對(duì)應(yīng)的URL中 Location:http://server.com/index.html
P3P 隱私策略,可以解決cookie跨域問(wèn)題
Public-Key-Pins 服務(wù)端安全協(xié)議證書(shū)的公鑰,降低偽造證書(shū)攻擊的風(fēng)險(xiǎn) Public-Key-Pins:pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="
Retry-After 用戶代理(瀏覽器)需要等待多久繼續(xù)重試 Retry-After: Wed, 21 Oct 2015 07:28:00 GMT
Server 服務(wù)器名稱 Server:nginx/12.0
Set-Cookie 設(shè)置HTTP Cookie Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/
Status 服務(wù)器端狀態(tài)碼 Status:200 OK
Trailer 分塊消息添加的額外信息,例如數(shù)字簽名,消息狀態(tài) Trailer: Expires

八.常用的HTTP錯(cuò)誤碼

  • 狀態(tài)碼有三位數(shù)字組成
  • 1xx表示請(qǐng)求已經(jīng)收到,需要后續(xù)處理
  • 2xx表示服務(wù)器成功處理了請(qǐng)求
  • 3xx表示客戶端需要進(jìn)一步操作才能完成請(qǐng)求
  • 4xx表示客戶端請(qǐng)求錯(cuò)誤
  • 5xx表示服務(wù)器錯(cuò)誤

1xx:請(qǐng)求已經(jīng)收到,需要后續(xù)處理

狀態(tài)碼 消息 描述
100 Continue 客戶端應(yīng)該繼續(xù)發(fā)送請(qǐng)求, 服務(wù)器必須在請(qǐng)求完成后向客戶端發(fā)送一個(gè)最終響應(yīng)
101 Switching Protocols 服務(wù)器已經(jīng)理解了客戶端的請(qǐng)求,
并將通過(guò)Upgrade消息頭通知客戶端采用不同的協(xié)議來(lái)完成這個(gè)請(qǐng)求,
發(fā)送完這個(gè)響應(yīng)之后, 服務(wù)器會(huì)切換到Upgrade消息頭中定義的協(xié)議
102 Processing 服務(wù)器將繼續(xù)進(jìn)行處理

2xx:服務(wù)器成功處理了請(qǐng)求

狀態(tài)碼 消息 描述
200 OK 請(qǐng)求已經(jīng)成功
201 Created 請(qǐng)求已經(jīng)被實(shí)現(xiàn)
202 Accepted 請(qǐng)求已經(jīng)被接收,但還沒(méi)有開(kāi)始處理
203 Non-Authoritative Information 服務(wù)器已經(jīng)成功處理了請(qǐng)求, 但是返回的實(shí)體頭部元信息不是在原始服務(wù)器上有效的確定集合
204 No Content 服務(wù)器成功處理了請(qǐng)求, 但不需要返回任何實(shí)體內(nèi)容
205 Reset Content 服務(wù)器成功處理了請(qǐng)求, 但不需要返回任何實(shí)體內(nèi)容, 但與204不同之處在于該返回碼要求請(qǐng)求者重置文檔視圖
206 Partial Content 服務(wù)器已經(jīng)成功處理了部分GET請(qǐng)求
207 Multi-Status 表示之后的消息將是一個(gè)XML消息, 并且可能按照之前子請(qǐng)求數(shù)量的不同, 包含一系列獨(dú)立的響應(yīng)代碼

3xx:客戶端需要進(jìn)一步操作才能完成請(qǐng)求

狀態(tài)碼 消息 描述
300 Multiple Choices 被請(qǐng)求的資源有一系列可供選擇的回饋信息, 客戶端可以自行選擇一個(gè)首選的地址進(jìn)行重定向
301 Moved Permanently 被請(qǐng)求的資源已經(jīng)被永久移動(dòng)到新位置
302 Move Temporarily 請(qǐng)求的資源歷史才能夠不同的URI響應(yīng)請(qǐng)求
303 See Other 對(duì)應(yīng)的請(qǐng)求的響應(yīng)可以在另一個(gè)URI上被找到
304 Not Modified 如果客戶端發(fā)送了一個(gè)帶條件的GET請(qǐng)求, 自上次訪問(wèn)以來(lái)文檔的內(nèi)容沒(méi)有被修改, 那么服務(wù)器返回這個(gè)狀態(tài)碼
305 Use Proxy 被請(qǐng)求的資源必須通過(guò)制定的代理才能訪問(wèn)
306 Switch Proxy 在最新的規(guī)范中, 306狀態(tài)碼已經(jīng)不再被使用
307 Temporary Redirect 請(qǐng)求的資源臨時(shí)從不同的URI響應(yīng)請(qǐng)求

4xx:客戶端請(qǐng)求錯(cuò)誤

狀態(tài)碼 消息 描述
400 Bad Request 語(yǔ)義有誤, 服務(wù)器無(wú)法理解, 除非進(jìn)行修改, 否則客戶端不應(yīng)該重復(fù)提交該請(qǐng)求
401 Unauthorized 當(dāng)前請(qǐng)求需要用戶驗(yàn)證
402 Payment Required 預(yù)留狀態(tài)碼
403 Forbidden 服務(wù)器已經(jīng)理解請(qǐng)求, 但是拒絕處理
404 Not Found 請(qǐng)求失敗 請(qǐng)求的資源在服務(wù)器上找不到
405 Method Not Allowed 請(qǐng)求行中的請(qǐng)求方法不能被用于請(qǐng)求相應(yīng)的資源
406 Not Acceptable 請(qǐng)求的資源內(nèi)容無(wú)法滿足請(qǐng)求頭中的條件, 因而無(wú)法生成響應(yīng)實(shí)體
407 Proxy Authentication Required 與401響應(yīng)類(lèi)似, 只是客戶端必須在代理服務(wù)器上進(jìn)行身份驗(yàn)證
408 Request Timeout 請(qǐng)求超時(shí)
409 Conflict 和被請(qǐng)求的資源的當(dāng)前狀態(tài)存在沖突, 請(qǐng)求無(wú)法完成
410 Gone 被請(qǐng)求的資源在服務(wù)器上已經(jīng)不再可用, 而且沒(méi)有任何已知的轉(zhuǎn)發(fā)地址
411 Length Required 服務(wù)器拒絕在沒(méi)有定義Content-Length頭的情況下接受請(qǐng)求
412 Precondition Failed 服務(wù)器在驗(yàn)證請(qǐng)求的頭字段給出了先決條件,請(qǐng)求沒(méi)有滿足其中的一個(gè)或者多個(gè)
413 Request Entity Too Large 請(qǐng)求的實(shí)體數(shù)據(jù)大小超過(guò)了服務(wù)器能夠處理的范圍
414 Request-URI Too Long 請(qǐng)求的URI長(zhǎng)度超過(guò)了服務(wù)器能夠解釋的長(zhǎng)度
415 Unsupported Media Type 請(qǐng)求提交的實(shí)體不是服務(wù)器支持的格式
416 Requested Range Not Satisfiable 請(qǐng)求中包含了Range請(qǐng)求頭, 并且Range中指定的任何數(shù)據(jù)范圍都與當(dāng)前資源的可用范圍不重合, 同時(shí)請(qǐng)求頭中沒(méi)有定義If-Range請(qǐng)求頭
417 Expectation Failed 請(qǐng)求頭中Expect中指定的預(yù)期內(nèi)容沒(méi)有被服務(wù)器滿足
421 Too Many Connections 從當(dāng)前客戶端所在的IP地址到服務(wù)器的連接數(shù)已經(jīng)超過(guò)了服務(wù)器許可的最大范圍
422 Unprocessable Entity 請(qǐng)求格式正確, 但是語(yǔ)義錯(cuò)誤
423 Locked 當(dāng)前資源被鎖定
424 Failed Dependency 由于之前的某個(gè)請(qǐng)求發(fā)生錯(cuò)誤, 導(dǎo)致當(dāng)前請(qǐng)求失敗
425 Unordered Collection 還沒(méi)有投入使用
426 Upgrade Required 客戶端應(yīng)該切換到TLS/1.0
449 Retry With 由微軟擴(kuò)展, 代表請(qǐng)求應(yīng)該在完成適當(dāng)?shù)牟僮骱笾卦?/td>
451 該請(qǐng)求因法律原因不可用

5xx:服務(wù)器錯(cuò)誤

狀態(tài)碼 消息 描述
500 Internal Server Error 服務(wù)器遇到了一個(gè)未曾預(yù)料的狀況, 導(dǎo)致它無(wú)法完成對(duì)請(qǐng)求的處理
501 Not Implemented 服務(wù)器不支持請(qǐng)求所需要的某個(gè)功能
502 Bad Gateway 作為網(wǎng)關(guān)或者代理的服務(wù)器執(zhí)行請(qǐng)求時(shí), 從上游服務(wù)器收到無(wú)效的響應(yīng)
503 Service Unavailable 服務(wù)器臨時(shí)維護(hù)或者過(guò)載, 服務(wù)器當(dāng)前無(wú)法處理請(qǐng)求
504 Gateway Timeout 網(wǎng)關(guān)或代理服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí), 未能及時(shí)從上游服務(wù)器(URI標(biāo)識(shí)出來(lái)的服務(wù)器, 例如HTTP, FTP, LDAP)或者輔助服務(wù)器(例如DNS)收到響應(yīng)
505 HTTP Version Not Supported 服務(wù)器不支持或者拒絕支持請(qǐng)求中使用的HTTP版本
506 Variant Also Negotiates 代表服務(wù)器存在內(nèi)部配置錯(cuò)誤
507 Insufficient Storage 服務(wù)器無(wú)法存儲(chǔ)完成請(qǐng)求所需要的內(nèi)容
509 BandWidth Limit Exceeded 服務(wù)器達(dá)到帶寬限制
510 Not Extended 獲取資源所需要的策略沒(méi)有得到滿足
600 Unparseable Response Headers 源站沒(méi)有返回響應(yīng)頭部,只返回實(shí)體內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容