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
請求報文

響應報文

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

