HTTP工作原理

HTTP的定義

一種網(wǎng)絡傳輸協(xié)議,位于 TCP / IP 協(xié)議族的最頂層——應?層

HTTP

Hypertext Transfer Protocol,超?本傳輸協(xié)議,和 HTML (Hypertext Markup Language 超?本標記語言) ?起誕?,?于在?絡上請求和傳輸 HTML 內容

HTTP的工作方式

瀏覽器

?戶輸入地址后回?或點擊鏈接 -> 瀏覽器拼裝 HTTP 報文并發(fā)送請求給服務? -> 服務?處理理請求后發(fā)送響應報?給瀏覽器 -> 瀏覽器解析響應報?并使?用渲染引擎顯示到界?

手機APP

用戶點擊或界??動觸發(fā)聯(lián)網(wǎng)需求 -> Android 代碼調用拼裝 HTTP 報?并發(fā)送請求到服務器 -> 服務器處理請求后發(fā)送響應報?給?機 -> Android 代碼處理理響應報文并作出相應處理(如儲存數(shù)據(jù)、加?數(shù)據(jù)、顯示數(shù)據(jù)到界面)

URL和HTTP報文

URL格式

URL分三部分組成:協(xié)議類型://服務器地址[:端口號]路徑(path)


image

請求報文

image

響應報文

image

Request Method

GET

  • 用于獲取服務器資源
  • 對于服務器數(shù)據(jù)不進行修改
  • 請求報文沒有body
  • HTTP/0.9 只有這一個方法
  • 冪等性操作
請求報文:
GET       /users/1    HTTP/1.1      //請求行
Host:    api.github.com             //Header

對應Retrofit代碼:
@GET("/users/{id}")
Call<User>  getUserById(@Path("id") String id, @Query("gender") String gender);
//@Path 會替代路徑中的占位符    @Query會以?為間隔拼接在path后面

POST

  • 用于增加或修改資源
  • 發(fā)送給服務的的內容寫在請求報文body里面
  • 非冪等性操作
請求報文:
POST   /users    HTTP/1.1     //請求行
Host:     api.github.com        //Header
Content-Type:  application/x-www-form-urlencoded
Content-Length: 13

name=hsicen&gender=male   //body

對應Retrofit代碼:
@FormUrlEncoded
@POST("/users")
Call<User>   addUser(@Filed("name") String name, @Filed("gender") String gender);
//@Filed 會將請求參數(shù)以鍵值對的方式放在body中

PUT

  • 用于修改資源
  • 發(fā)送給服務的的內容寫在請求報文body里面
  • 冪等性操作
請求報文:
PUT      /users/1    HTTP/1.1    //請求行
Host:    api.github.com    //Header
Content-Type:    application/x-www-form-urlencoded
Content-Length:    13

gender=female       //body

對應Retrofit代碼:
@FormUrlEncoded
@PUT("/users/{id}")
Call<User>    updateGenderById(@Path("id") String id, @Filed("gender") String gender);

DELETE

  • 用于刪除資源
  • 請求報文沒有body
  • 冪等性操作
請求報文:
DELETE    /users/1    HTTP/1.1    //請求行
Host:    api.github.com    //Header

對應Retrofit代碼:
@DELETE("/users/{id}")
Call<User>    deleteUserById(@Path("id") Stirng id);

HEAD

  • 和GET使用方法完全相同
  • 和GET的唯一區(qū)別是響應報文中沒有body
  • 可以從返回的Header中獲取相關信息,比如多線程下載先判斷下載內容的大小
  • 冪等性操作

StatusCode狀態(tài)碼

三位數(shù)字,用于對響應結果做出類型化描述(如:獲取成功,內容未找到)
1xx:臨時性消息 如:100(繼續(xù)發(fā)送) 101(正在切換協(xié)議)
2xx:成功 如:200(OK) 201(創(chuàng)建成功)
3xx:重定向 如:301(永久移動) 302(暫時移動) 304(內容未改變)
4xx:客戶端錯誤 如:400(客戶端請求錯誤) 401(認證失敗) 403(被禁止) 404(找不大內容)
5xx:服務器錯誤 如:500(服務器內部錯誤)

Header解析

Host

服務器主機域名,不是在網(wǎng)絡上用于尋址的,而是在目標服務器上用于定位子服務器的
虛擬主機:將一臺計算機主機分成一臺臺"虛擬"的子主機,每一臺主機都有獨立的域名和ip地址
計算機網(wǎng)絡尋址過程:


image

Content-Type

指定body的類型,主要有4類

1.text/html

請求web頁面返回的響應類型,body中返回的是html文本。響應報文格式如下:

HTTP/1.1    200    OK
Content-Type:    text/html; charset=utf-8
Content-Length:    853
<! DOCTYPE  html>
<html>
<head>
<meta charset="utf-8">
......
2. application/x-www-form-urlencoded

Web頁面純文本表單的提交方式。請求報文格式如下:

POST    /users    HTTP/1.1
Host:    api.github.com
Content-Type:    application/x-www-form-urlencoded
Content-Length:    23

name=hsicen&gender=male

對應Retrofit代碼:
@FormUrlEncoded
@POST("/users")
Call<User>   addUser(@Filed("name") String name, @Filed("gender") String gender);
3. multipart/form-data

Web頁面含有二進制文件時的提交方式 。請求報文格式如下:

POST    /users    HTTP/1.1
Host:    api.github.com
Content-Type:    multipart/form-data;  boundary=
------WebKitFormBoundary7MA4YWxkTrZu0gw    //boundary為分隔符,類似于參數(shù)分隔符&
Content-Length:    2381

------WebKitFormBoundary7MA4YWxkTrZu0gw
Content-Dispoaition:    form-data;  name="name"

hsicen
------WebKitFormBoundary7MA4YWxkTrZu0gw
Content-Dispoaition:    form-data;  name="avator";  filename="avator.jpg"
Content-Type:    image/jpeg

hiasdoiadoijOIJOSIJDSDojoajoida8279823DISJDISJ.......   //圖片二進制內容
------WebKitFormBoundary7MA4YWxkTrZu0gw


對應Retrofit代碼:
@Multipart
@POST("/users/{id}")
Call<User>  updateUserAvator(
    @Path("id") String id, 
    @Part("name") RequestBody name, 
    @Part("avator") RequestBody avator
)

RequestBody  namePart = RequestBody.create(MediaType.parse("text/plain"), "hsicen");
RequestBody  avatorPart = RequestBody.create(MediaType.parse("image/jpeg"), avatorFile);
api.updateUserAvator("21", namePart, avatorPart);
4.application/json,image/jpeg,application/zip

單項內容(文本或非文本都可以),用于Web Api的響應或者POST/PUT請求

請求中提交json(application/json)
請求報文:
POST    /users    HTTP/1.1
Host:    api.github.com
Content-Type:    application/json;  charset=utf-8
Content-Length:    33

{"name"="hsicen","gender"="male"}

對應Retrofit代碼:
@POST("users")
Call<User>    addUser(@Body("user") User user);

api.addUser(User("hsicen","male"))   //Retrofit需要使用JSON相關的Converter
響應中返回json(application/json)
響應報文如下:
HTTP/1.1    200    OK
Content-Type:    application/json;  charset=utf-8
Content-Length:    345

[{"name":"hsicen","gender"="male","id"="1"},{"name":"hsicen","gender"="male","id"="1"},{"name":"hsicen","gender"="male","id"="1"},.......
請求中提交二進制內容(image/jpeg)   單文件
請求報文如下:
POST    /users/1/avator    HTTP/1.1
Host:    api.github.com
Content-Type:    image/jpeg
Content-Length:    12345

sakdhkuUHUISDhhkdhSHdoi2asiajsoij......

對應Retrofit代碼:
@POST("users/{id}/avator")
Call<User>    updateAvator(@Path("id") String id, @Body  RequestBody avator);

RequestBody  avatorBody = RequestBody.create(MediaType.parse("image/jpeg"), avatorFile);
api.updateAvator(avatorBody);
響應中返回二進制內容(image/jpeg)
響應報文如下:
HTTP/1.1    200    OK
Content-Type:    image/jpeg;  charset=utf-8
Content-Length:    32423

shdkasdKHKJHdslajdkshu238shdhsdjKBJ...... 

Content-Length

Content-Length: 311
指定body的長度(字節(jié))

Transfer-Encoding

Transfer-Encoding: chunked
分塊傳輸,快速響應

Location

Location: https:www.hencoder.com
指定重定向的目標URL(301,302)

User-Agent

User-Agent: Mozilla/5.0...... 平臺標識
用戶代理,即是誰發(fā)送的請求,接收響應的,例如手機瀏覽器,某款手機App

Range/Accept-Ranges

按范圍取數(shù)據(jù),用于斷點續(xù)傳和多線程下載

Accept-Ranges: bytes 響應報文中出現(xiàn),標識服務器支持按字節(jié)來取范圍數(shù)據(jù)
Range: bytes=start-end 請求報文中出現(xiàn),表示要取哪段數(shù)據(jù)
Content-Range: bytes start-end/all 響應報文中出現(xiàn),表示發(fā)送的是哪段數(shù)據(jù)

Cache(緩存) & Buffer(緩沖)

在客戶端或中間結點緩存數(shù)據(jù),降低從服務器獲取數(shù)據(jù)的頻率,以提高網(wǎng)絡性能

Cache-Control: xxxx 設置緩存類型,比如:no-cache,no-store,max-age=315360(限制緩存時間)
Last-Modified: xxxx 上一次修改的時間

其它Headers

Cookie/Set Cookie: xxxxx 發(fā)送/設置Cookie
Authorization: xxxxx 授權信息
Accept: xxxx 客戶端能接受的數(shù)據(jù)類型,比如:text/html
Accept-Charset: xxxx 客戶端能接收的字符集,比如:utf-8
Accept-Encoding: xxx 客戶端能接收的壓縮編碼類型,比如:gzip
Content-Encoding: xxxx 壓縮類型,比如:gzip

REST HTTP

按照以上規(guī)定,正確使用HTTP

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1. OSI 七層模型 OSI(Open System Interconnection,開放系統(tǒng)互連)七層網(wǎng)絡模型...
    黃露hl閱讀 4,342評論 0 0
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,511評論 6 13
  • 1. HTTP HTTP協(xié)議:簡單對象訪問協(xié)議,對應于應用層 ,HTTP協(xié)議是基于TCP/IP連接的。正因為...
    bfe31c902d9b閱讀 2,107評論 0 3
  • 第一章、HTTP概述1、Web瀏覽器、服務器和相關的Web應用程序都是通過HTTP相互通信的,HTTP是現(xiàn)代全球因...
    橫沖直撞666閱讀 739評論 0 1
  • Web 頁面的實現(xiàn) Web 基于 HTTP 協(xié)議通信 客戶端(Client)的 Web 瀏覽器從 Web 服務器端...
    毛圈閱讀 1,333評論 0 2

友情鏈接更多精彩內容