1. 程式人生 > >OkHttp的基本使用-1(Http協議介紹)

OkHttp的基本使用-1(Http協議介紹)

Http是一個屬於應用層的面向物件的協議,由於其簡潔、快速的方式,適用於分散式超媒體資訊系統。

它於1990年提出,經過今年的使用與發展,得到不斷地完善和擴充套件。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已提出。

把Http協議中通訊的兩方稱作Client和Server(或Host),Client向Server端經過Http協議傳送一個RequestServer端收到Request後經過一系列的處理返回Client一個Response,整個過程如下圖所示:

這裡寫圖片描述

Http?

全稱:超文字傳輸協議(Hyper Text Transfer Protocol)
作用:設計之初是為了將超文字標記語言(HTML)文件從Web伺服器傳送到客服端的瀏覽器,現在http
的作用不侷限於HTML的傳輸。 版本: http/1.0 http/1.1x http/2.0
URL詳解

一個示例URL

http://www.baidu.com:8080/find/test;id=12312?name=xiao&password=xxx#stuff

當然很多URL地址都沒有那麼多,此處為了演示URL的所包含的內容。

Schema: http
host: www.baidu.com
port: 8080
path: /find/test
url-params: id=12312
query-string: name=xiao&password=xxx
anchor: stuff

scheme: 指定底層使用的協議(例如:http
, https, ftp) host: Http伺服器的ip地址或者域名 port: Http伺服器的預設埠是80,這種情況下埠號可以省略。如果使用了別的埠,必須指明:例如:http://www.mywebsite.com:8080/ path: 訪問資源的路徑 url-params query-string: 發給http伺服器的資料 anchor: 錨
無狀態的協議

http協議是無狀態的:
   同一個客服端的這次請求和上次請求是沒有對應關係,對http伺服器來說,它並不知道這兩個請求來自同一個客服端。

解決方法: Cookie機制來維護狀態

既然Http協議是無狀態的,那麼Connection:keep-alive又是怎麼一回事?
    無狀態是指協議對於事務處理沒有記憶能力,伺服器不知道客服端是什麼狀態。從另一方面講,開啟一個伺服器上的網頁和你之前開啟這個伺服器上的網頁之間沒有任何聯絡。
1.Request訊息的結構:三部分

第一部分叫Request line(請求行), 第二部分叫http header, 第三部分是body

請求行: 包括http請求的種類,請求資源的路徑,http協議版本
http header: http頭部資訊
body: 傳送給伺服器的query資訊
當使用的是"GET"方法的時候,body是為空的(GET只能讀取伺服器上的資訊,post能寫入)

這裡寫圖片描述

Response訊息的結構

也分為三部分,第一部分叫request line,第二部分叫request header,第三部分是body

request line: 協議版本、狀態碼、message
request header: request頭資訊
body: 返回的請求資源主體

這裡寫圖片描述

Http協議-請求方法

GET: 請求獲取Request-URL所標識的資源
POST: 在Request-URl所標識的資源後附加新的資料
HEAD: 請求獲取有Request-URL所標識的資源的響應訊息報頭
PUT: 請求伺服器儲存一個資源,並用Request-URL作為其標識
DELETE: 請求伺服器刪除Request-URL所標識的資源
TRACE: 請求伺服器回送到的請求資訊,主要用於測試或診斷
CONNECT: 保留將來使用
OPTIONS: 請求查詢伺服器的效能,或者查詢與資源相關的選項和需求
GET和POST區別

http協議定義了很多與伺服器互動的方法,最基本的有4中,分別是GET,POST,PUT,DELETE。一個URL地址用於描述一個網路上的資源,而Http中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,增,刪4個操作。我們最常見的就是GET和POST了。GET一般用於獲取/查詢資源資訊,而POST一般用於更新資源資訊。

1.GET提交的資料會放在URL之後,以?分割URL和傳輸資料,引數之間以&相連,如EditPosts.aspx?name=test&id=123456。POST方法是把提交的資料放在HTTP的Body中。
2.GET提交的資料大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的資料沒有限制。
3.GET方式需要使用Request.QueryString來獲得變數的值,而POST方式通過Request.Form來獲取變數的值。
4.GET方式提交資料,會帶來安全問題,比如一個登陸頁面,通過GET方式提交資料時,使用者名稱和密碼將出現在URL上,如何頁面可以被快取或者其他人可以訪問這臺機器,就可以從歷史記錄獲得使用者的賬號和密碼。
狀態碼

Response訊息中的第一行叫做狀態行,由HTTP協議版本號,狀態碼,狀態訊息三部分組成。
狀態碼用來告訴HTTP客服端,HTTP伺服器是否產生了預期的Response。
HTTP/1.1中定義了5類狀態碼。
狀態碼有三位數字組成,第一個數字定義了響應的類別

1xx: 指示資訊--表示請求已接收,繼續處理
2xx: 成功--表示請求已被成功接收、理解、接受
3xx: 重定向--要完成請求必須進行更進一步的操作
4xx: 客服端錯誤--請求有語法錯誤或請求無法實現
5xx: 伺服器端錯誤--伺服器未能實現合法的請求

下面是一些常見的錯誤碼
200 OK  //客服端請求成功
400 Bad Request //客服端請求有語法錯誤,不能被伺服器所理解
401 Unauthorized //請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //伺服器收到請求,但是拒絕提供服務
404 Not Found
//請求資源不存在, eg:輸入了錯誤的URL
500 Internal Server Error //伺服器傳送不可預期的錯誤
503 Server Unavailable //伺服器當前不能處理客服端的請求,一段時間後可能恢復正常