中文名稱--超文本傳輸協議,是TCP/IP協議族的最頂層-應用層。html
URL格式分爲三部分:
協議類型://服務器地址(和端口號)/路徑(Path)
https://segmentfault.com/writ...node
不發送Body請求體。nginx
GET /users/1 HTTP/1.1 Host: api.github.com
POST /users HTTP/1.1 Host: api.github.com Content-Type: application/x-www-form-urlencoded (Content-Type爲 「application/x-www-form-urlencoded」時,纔會讀取Body中的內容) Content-Length: 13 name=lvzishen&gender=male
PUT /users HTTP/1.1 Host: api.github.com Content-Type: application/x-www-form-urlencoded (Content-Type爲 「application/x-www-form-urlencoded」時,纔會讀取Body中的內容) Content-Length: 13 name=lvzishen&gender=male
DELETE /users/1 HTTP/1.1 Host: api.github.com
HEAD /users/1 HTTP/1.1 Host: api.github.com
用於對相應結果做出類型化描述。git
1.Header是什麼?
HTTP消息的metadata
(元數據)。 github
2.什麼是元數據?通俗的講就是數據的屬性
。以一個登陸接口爲例,用戶名密碼是上傳的數據(放在BODY中),那麼用戶名密碼的長度( Content-Length)、以什麼類型( Content-Type )上傳等等就是它的元數據。web
目標主機。注意:不是在網絡上用於尋址(尋址用DNS)的,而是在目標服務器(找到IP後一個IP下有可能有多個主機名,肯定訪問的是哪個主機)上用於定位子服務器的。算法
(1). text/html: 請求 Web 頁面是返回響應的類型,Body 中返回 html文本。格式以下:json
HTTP/1.1 200 OK Content-Type: text/html;charset=utf-8 Content-Length: 853 ...... <!DOCTYPE html> <html> <head> <meta charset="utf-8"> .....
(2). x-www-form-urlencoded : 純文本表單的提交方式(只有以表單
形式提交時,纔會讀取Body中的內容)。 格式以下:segmentfault
POST /users HTTP/1.1 Host: api.github.com Content-Type: application/x-www-form-urlencoded Content-Length: 27 name=lvzishen&gender=male
對應 Retrofit 的代碼:api
@FormUrlEncoded <--表明的是以普通表單(application/x-www-form-urlencoded)上傳文本參數,加了這個註解後纔會讀取@Field中的參數,由於@Field最後會轉變爲請求體Body中的內容. @POST("/users") Call addUser(@Field("name") String name, @Field("gender") String gender);
(3).multipart/form-data :頁面含有二進制文件時的提交方式(上傳文件或文字均可以,可是通常沒有用此上傳純文字,由於會多加如boundary、分隔符等字符,浪費流量和帶寬)。(只有以表單形式提交時,纔會讀取Body中的內容)。 格式以下:
POST /users HTTP/1.1 Host: hencoder.com Content-Type: multipart/form-data; boundary=---- boundary爲起始點 WebKitFormBoundary7MA4YWxkTrZu0gW Content-Length: 2382 ------WebKitFormBoundary7MA4YWxkTrZu0gW WebKitFormBoundary7MA4YWxkTrZu0gW<--爲分隔符 Content-Disposition: form-data; name="name" rengwuxian ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="avatar"; filename="avatar.jpg" Content-Type: image/jpeg JFIFHHvOwX9jximQrWa......
(4). application/json , image/jpeg , application/zip ...
單項內容(文本或非文本均可以),用於 Web Api 的響應或者 POST / PUT 的請求
請求中提交 JSON:
POST /users HTTP/1.1 Host: hencoder.com Content-Type: application/json; charset=utf-8 Content-Length: 38 {"name":"lvzishen","gender":"male"}
響應中返回JSON:
HTTP/1.1 200 OK content-type: application/json; charset=utf-8 content-length: 234 [{"login":"mojombo","id":1,"node_id":"MDQ6VXNl cjE=","avatar_url":"https://avatars0.githubuse rcontent.com/u/1?v=4","gravat......
image/jpeg:提交或獲取圖片
POST /user/1/avatar HTTP/1.1 Host: hencoder.com Content-Type: image/jpeg Content-Length: 1575 JFIFHH9......
指定 Body 的長度(字節)。用於二進制文件中的長度讀取,由於不能肯定讀取到哪裏,因此規定長度,讀取到對應長度後表明讀取完成再也不讀取。
用於當響應發起時,內容長度還沒能肯定的狀況下。和 Content-Length 不一樣時使用。用途是儘早給出響應,減小用戶等待。
HTTP/1.1 200 OK Content-Type: text/html Transfer-Encoding: chunked 4 Chun <--不斷給出數據 先給4字節的Chun,再給9字節的ked Trans,.....,0表明傳輸完成所有加載完畢。 9 ked Trans 12 fer Encoding 0
指定重定向的目標的URL
用戶代理,便是誰實際發送請求、接受響應的,例如手機瀏覽器、某款手機 App。
按範圍取數據
做用:斷點續傳、多線程下載。
做用:在客戶端或中間網絡節點緩存數據,下降從服務器取數據的頻率,以提升網絡性能。
格式:Authorization: Basic username:password(Base64ed) 對用戶名密碼作Base64編碼,不是加密的,Base64只是編碼。
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
格式:Authorization: Bearer token
bearer token 的獲取方式:
經過 OAuth2 的受權流程 OAuth2 的流程
答:爲了安全。OAuth 不強制受權流程必須使用 HTTPS,所以須要保證當通訊路徑中存在竊聽者時,依然具備足夠的安全性。
在自家 App 中使用 Bearer token
有的 App 會在 Api 的設計中,將登陸和受權設計成相似 OAuth2 的過程,但簡化掉 Authorization code 概念。即:登陸接收請求成功時,會返回 access token,而後客戶端在之 後的請求中,就可使用這個 access token 來當作 bearer token 進行用戶操做了。 (這麼作失去了使用OAuth2的意義)
Refresh token 用法:access token 有失效時間,在它失效後,調用 refresh token 接口,傳入efresh_token 來獲取新的 access token。
{ "token_type": "Bearer", "access_token": "xxxxx", "refresh_token": "xxxxx", "expires_time": "xxxxx" }
目的:安全。
當 access token 失竊時,因爲它有失效時間,所以壞人只有較短的時間來「作壞事」;同時,因爲(在標準的 OAuth2 流程中)refresh token 永遠只存在與第三方服務的服務 器中,所以 refresh token 幾乎沒有失竊的風險。
以HTTP標準協議去使用HTTP。
好比:
HTTP 1.0須要使用keep-alive參數來告知服務器端要創建一個長鏈接,而HTTP1.1默認支持長鏈接。Connection:keep-alive(雖然是不斷開可是每次也只能串行的執行HTTP請求,2.0才支持並行)
HTTP是基於TCP/IP協議的,建立一個TCP鏈接是須要通過三次握手的,有必定的開銷,若是每次通信都要從新創建鏈接的話,對性能有影響。所以最好能維持一個長鏈接,能夠用個長鏈接來發多個請求。
持久鏈接的時間參數,一般由服務器設定,好比 nginx 的 keepalivetimeout,keepalive timout
時間值意味着:一個 http 產生的 tcp 鏈接在傳送完最後一個響應後,還須要 hold 住 keepalive_timeout (一般爲5-15S)秒後,纔開始關閉這個鏈接;
HTTP 1.1支持只發送header信息(不帶任何body信息),若是服務器認爲客戶端有權限請求服務器,則返回100,不然返回401。客戶端若是接受到100,纔開始把請求body發送到服務器。
這樣當服務器返回401的時候,客戶端就能夠不用發送請求body了,節約了帶寬。
另外HTTP還支持傳送內容的一部分。這樣當客戶端已經有一部分的資源後,只須要跟服務器請求另外的部分資源便可。這是支持文件斷點續傳的基礎。
如今能夠web server例如tomat,設置虛擬站點是很是常見的,也便是說,web server上的多個虛擬站點能夠共享同一個ip和端口。
HTTP1.0是沒有host域的,HTTP1.1才支持這個參數。
1.單一長鏈接
在HTTP/2中,客戶端向某個域名的服務器請求頁面的過程當中,只會建立一條TCP鏈接,即便這頁面可能包含上百個資源。 單一的鏈接應該是HTTP2的主要優點,單一的鏈接能減小TCP握手帶來的時延 。HTTP2中用一條單一的長鏈接,避免了建立多個TCP鏈接帶來的網絡開銷,提升了吞吐量。
2.多路複用
HTTP2雖然只有一條TCP鏈接,可是在邏輯上分紅了不少stream。
HTTP2把要傳輸的信息分割成一個個二進制幀,首部信息會被封裝到HEADER Frame,相應的request body就放到DATA Frame,一個幀你能夠當作路上的一輛車,只要給這些車編號,讓1號車都走1號門出,2號車都走2號門出,就把不一樣的http請求或者響應區分開來了。可是,這裏要求同一個請求或者響應的幀必須是有有序的,要保證FIFO的,可是不一樣的請求或者響應幀能夠互相穿插。這就是HTTP2的多路複用,是否是充分利用了網絡帶寬,是否是提升了併發度?
HTTP1.1不支持header數據的壓縮,HTTP2.0使用HPACK算法對header的數據進行壓縮,這樣數據體積小了,在網絡上傳輸就會更快。
至關於創建一個映射表,如GET方法直接定義爲映射表中的數字2,那麼GET請求時請求方法寫2就能夠而不用寫GET,這樣就能夠節省流量和空間。
這個功能一般被稱做「緩存推送」。主要的思想是:當一個客戶端請求資源X,而服務器知道它極可能也須要資源Z的狀況下,服務器能夠在客戶端發送請求前,主動將資源Z推送給客戶端,這樣當使用Z資源時就不用請求網絡直接本地取數據就能夠了,加快獲取速度。