11 HTTP與RESTful

2018-02-24 15:53 更新

HTTP與RESTful

11.1 你所沒(méi)有深入的HTTP

Internet有兩個(gè)核心協(xié)議: IP和TCP,這樣講述起來(lái)似乎會(huì)很漫長(zhǎng)。

基本概念

超文本傳輸協(xié)議 (HTTP-Hypertext transfer protocol) 是一種詳細(xì)規(guī)定了瀏覽器和萬(wàn)維網(wǎng)服務(wù)器之間互相通信的規(guī)則,通過(guò)因特網(wǎng)傳送萬(wàn)維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。

  • HTTP是用于客戶端與服務(wù)端之間的通信。
  • 傳輸層的TCP是基于網(wǎng)絡(luò)層的IP協(xié)議的,而應(yīng)用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的。

注意: HTTP協(xié)議只規(guī)定了客戶端與服務(wù)端的通信規(guī)則,而沒(méi)有規(guī)定其通訊協(xié)議,只是現(xiàn)在的大部分實(shí)現(xiàn)都是將TCP作為通訊協(xié)議。

11.1.1 打開網(wǎng)頁(yè)時(shí)發(fā)生了什么

簡(jiǎn)單地來(lái)說(shuō),當(dāng)我們?cè)跒g覽器上輸入U(xiǎn)RL的敲下回車的時(shí)候。

  • 瀏覽器需要查找域名^domain的IP,從不同的緩存直至DNS服務(wù)器。
  • 瀏覽器會(huì)給web服務(wù)器發(fā)送一個(gè)HTTP請(qǐng)求
  • 服務(wù)器“處理”請(qǐng)求
  • 服務(wù)器發(fā)回一個(gè)HTML響應(yīng)
  • 瀏覽器渲染HTML到頁(yè)面。

StackOverflow上有一個(gè)這樣的回答會(huì)比較詳細(xì)。

  • browser checks cache; if requested object is in cache and is fresh, skip to #9
  • browser asks OS for server's IP address
  • OS makes a DNS lookup and replies the IP address to the browser
  • browser opens a TCP connection to server (this step is much more complex with HTTPS)
  • browser sends the HTTP request through TCP connection
  • browser receives HTTP response and may close the TCP connection, or reuse it for another request
  • browser checks if the response is a redirect (3xx result status codes), authorization request (401), error (4xx and 5xx), etc.; these are handled differently from normal responses (2xx)
  • if cacheable, response is stored in cache
  • browser decodes response (e.g. if it's gzipped)
  • browser determines what to do with response (e.g. is it a HTML page, is it an image, is it a sound clip?)
  • browser renders response, or offers a download dialog for unrecognized types

忽略一些細(xì)節(jié)便剩下了

  1. 從瀏覽器輸入U(xiǎn)RL
  2. 瀏覽器找到服務(wù)器,服務(wù)器返回HTML文檔
  3. 從對(duì)應(yīng)的服務(wù)器下載資源

說(shuō)說(shuō)第一步,開始時(shí)我們輸入的是URI(統(tǒng)一資源標(biāo)識(shí)符,Uniform Resource Identifier),它還有另外一個(gè)名字叫統(tǒng)一資源定位器(URL[^URL],Uniform Resource Locator)。

11.1.2 URL組成

網(wǎng)址算是URL的一個(gè)俗稱,讓我們來(lái)看看一個(gè)URL的組成,以HTTP版IOT中的URL為例。

http://b.phodal.com/athome/1

開始之前,我們需要標(biāo)出URL的80端口以及json文件的全稱,那么上面的網(wǎng)址就會(huì)變成

http://b.phodal.com:80/athome/1.json

那么對(duì)于這個(gè)URL的就有下面幾部分組成

  • http://?http說(shuō)的是這個(gè)URL用的是HTTP協(xié)議,至于//是一個(gè)分隔符,用法和C語(yǔ)言中的;一樣。這樣的協(xié)議還可以是coap,https,ftp等等。
  • b?是子域名,一個(gè)域名在允許的情況下可以有不限數(shù)量的子域名。
  • phodal.com?代表了一個(gè)URL是phodal.com下面的域名
  • 80?80是指80端口,默認(rèn)的都是80,對(duì)于一個(gè)不是80端口的URL應(yīng)該是這樣的http://iot-coap.phodal.com:8896/
  • athome?指的是虛擬目錄部分,或者文件路徑
  • 1.json看上去就是一個(gè)文件名,然而也代表著這是一個(gè)資源。

對(duì)就一個(gè)稍微復(fù)雜點(diǎn)的例子就是

http://designiot.phodal.com/#你所沒(méi)有深入的http

這里的#后面是錨部分,如果你打開這個(gè)URL就會(huì)發(fā)現(xiàn)會(huì)直接跳轉(zhuǎn)到相應(yīng)的錨部分,對(duì)就于下面這樣的一個(gè)例子來(lái)說(shuō)

http://www.phodal.com/search/?q=iot&type=blog

?后面的q=iot&type=blog的部分是參數(shù)部分,通常用于查詢或者、搜索。

11.2 一次HTTP GET請(qǐng)求

當(dāng)我們打開最小物聯(lián)網(wǎng)系統(tǒng)的一個(gè)頁(yè)面時(shí),如http://b.phodal.com/athome/1.json

我們?cè)跒g覽器上看到的結(jié)果是

[
  {
    "id": 1,
    "temperature": 19,
    "sensors1": 31,
    "sensors2": 7.5,
    "led1": 0
  }
]

只是我們看到的是結(jié)果,忽略了這其中的過(guò)程,于是我們用curl^curl命令來(lái)看看詳細(xì)的情況。

curl -I -s http://b.phodal.com/athome/1.json

出于某種原因考慮,刪去了其中一些元素,剩下下面這些。

HTTP/1.1 200 OK
Content-Type: application/json
Date: Fri, 05 Sep 2014 15:05:49 GMT

[{"id":1,"temperature":19,"sensors1":31,"sensors2":7.5,"led1":0}]

我們用curl命令向服務(wù)器發(fā)起了GET請(qǐng)求,服務(wù)器返回了上面的結(jié)果。

11.2.1 HTTP響應(yīng)

一個(gè)HTTP響應(yīng)由三部分組成

  • 狀態(tài)行(狀態(tài)碼)
  • 消息報(bào)頭(響應(yīng)報(bào)頭)
  • 響應(yīng)正文(消息體)

11.2.1.1 HTTP響應(yīng) 狀態(tài)碼

在上面的結(jié)果中,狀態(tài)行是

HTTP/1.1 200 OK

返回的狀態(tài)碼是200,OK是狀態(tài)碼的原因短語(yǔ)。

如果是一個(gè)跳轉(zhuǎn)的頁(yè)面,它就可能是下面的結(jié)果:

HTTP/1.0 301 MOVED PERMANENTLY
Date: Mon, 08 Sep 2014 12:04:01 GMT
Content-Type: text/html; charset=utf-8

HTTP Status有五種狀態(tài),而這五種狀態(tài)又有所細(xì)分,提一下這五種狀態(tài),詳細(xì)可參見(jiàn)http://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81

  • 1xx消息
  • 2xx成功
  • 3xx重定向
  • 4xx客戶端錯(cuò)誤
  • 5xx服務(wù)器錯(cuò)誤

  • 200 ok - 成功返回狀態(tài),對(duì)應(yīng),GET,PUT,PATCH,DELETE.
  • 201 created - 成功創(chuàng)建。
  • 304 not modified - HTTP緩存有效。
  • 400 bad request - 請(qǐng)求格式錯(cuò)誤。
  • 401 unauthorized - 未授權(quán)。
  • 403 forbidden - 鑒權(quán)成功,但是該用戶沒(méi)有權(quán)限。
  • 404 not found - 請(qǐng)求的資源不存在
  • 405 method not allowed - 該http方法不被允許。
  • 410 gone - 這個(gè)url對(duì)應(yīng)的資源現(xiàn)在不可用。
  • 415 unsupported media type - 請(qǐng)求類型錯(cuò)誤。
  • 422 unprocessable entity - 校驗(yàn)錯(cuò)誤時(shí)用。
  • 429 too many request - 請(qǐng)求過(guò)多。

11.2.1.2 HTTP響應(yīng) 響應(yīng)報(bào)頭

在這次響應(yīng)中,返回了兩個(gè)報(bào)頭,即

Content-Type: application/json
Date: Fri, 05 Sep 2014 15:05:49 GMT

Content-Type和Date,在這里的Context-Type是application/json,而通常情況下我們打開一個(gè)網(wǎng)站時(shí),他的Content-Type應(yīng)該是text/html。

Content-Type: text/html;

Content-Type是最重要的報(bào)頭。

11.2.1.3 HTTP響應(yīng) 響應(yīng)正文

正文才是我們真正想要的內(nèi)容,上面的都是寫給瀏覽器看的,一般的人不會(huì)去關(guān)注這些。

HTTP/1.1 200 OK
Server: phodal.com/0.17.5
Content-Type: application/json

[{"id":1,"temperature":19,"sensors1":31,"sensors2":7.5,"led1":0}]

通常這是以某種格式寫的,在這里是以JSON寫的,而對(duì)于一個(gè)網(wǎng)站的時(shí)候則是HTML,如:

<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

</body>
</html>

那么這次GET請(qǐng)求返回的就是:

HTTP/1.0 200 OK
Date: Mon, 08 Sep 2014 12:04:01 GMT
Content-Type: text/html; charset=utf-8    

<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    [{"id":1,"temperature":19,"sensors1":31,"sensors2":7.5,"led1":0}]        
</body>
</html>

雖然與第一次請(qǐng)求的結(jié)果在游覽器上看似乎是一樣的(ps:可能有微小的差異),然而其本質(zhì)是不同的。

推薦及參考書目:

  • 《Web性能權(quán)威指南》
  • 《圖解HTTP》
  • 《RESTful Web Services Cookbook》
  • 《RESTful Web APIs》

[^URL]: URL 是 URI 的子集

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)