中文名稱--超文本傳輸協議,是TCP/IP協議族的最頂層-應用層。應用層協議的產生只是爲了C/S雙方都能看懂數據,是對傳輸數據的包裝。html
URL格式分爲三部分: 協議類型://服務器地址(和端口號)/路徑(Path) https://segmentfault.com/write?freshman=1node
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
複製代碼
用於對相應結果做出類型化描述。nginx
1.Header是什麼? HTTP消息的 metadata
(元數據)。git
2.什麼是元數據? 通俗的講就是數據的屬性
。以一個登陸接口爲例,用戶名密碼是上傳的數據(放在BODY中),那麼用戶名密碼的長度( Content-Length)、以什麼類型( Content-Type )上傳等等就是它的元數據。github
目標主機。注意:不是在網絡上用於尋址(尋址用DNS)的,而是在目標服務器(找到IP後一個IP下有可能有多個主機名,肯定訪問的是哪個主機)上用於定位子服務器的。web
(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). x-www-form-urlencoded : 純文本表單的提交方式(只有以表單
形式提交時,纔會讀取Body中的內容)。 格式以下:json
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=lvzishen&gender=male
複製代碼
對應 Retrofit 的代碼:segmentfault
@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中的內容)。 格式以下:api
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 的流程
0. 第三方網站向受權受權方網站申請第三方受權合做,拿到 client id 和 client secret答:爲了安全。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 幾乎沒有失竊的風險。 ##七.RESTful是什麼? 以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才支持這個參數。
在HTTP/2中,客戶端向某個域名的服務器請求頁面的過程當中,只會建立一條TCP鏈接,即便這頁面可能包含上百個資源。 單一的鏈接應該是HTTP2的主要優點,單一的鏈接能減小TCP握手帶來的時延 。HTTP2中用一條單一的長鏈接,避免了建立多個TCP鏈接帶來的網絡開銷,提升了吞吐量。
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資源時就不用請求網絡直接本地取數據就能夠了,加快獲取速度。