Internet有兩個核心協(xié)議: IP和TCP,這樣講述起來似乎會很漫長。
基本概念
超文本傳輸協(xié)議 (HTTP-Hypertext transfer protocol) 是一種詳細規(guī)定了瀏覽器和萬維網(wǎng)服務器之間互相通信的規(guī)則,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。
注意
: HTTP協(xié)議只規(guī)定了客戶端與服務端的通信規(guī)則,而沒有規(guī)定其通訊協(xié)議,只是現(xiàn)在的大部分實現(xiàn)都是將TCP作為通訊協(xié)議。
簡單地來說,當我們在瀏覽器上輸入URL的敲下回車的時候。
在StackOverflow上有一個這樣的回答會比較詳細。
忽略一些細節(jié)便剩下了
說說第一步,開始時我們輸入的是URI(統(tǒng)一資源標識符,Uniform Resource Identifier),它還有另外一個名字叫統(tǒng)一資源定位器(URL[^URL],Uniform Resource Locator)。
網(wǎng)址算是URL的一個俗稱,讓我們來看看一個URL的組成,以HTTP版IOT中的URL為例。
http://b.phodal.com/athome/1
開始之前,我們需要標出URL的80端口以及json文件的全稱,那么上面的網(wǎng)址就會變成
http://b.phodal.com:80/athome/1.json
那么對于這個URL的就有下面幾部分組成
http://
?http說的是這個URL用的是HTTP協(xié)議,至于//
是一個分隔符,用法和C語言中的;
一樣。這樣的協(xié)議還可以是coap,https,ftp等等。b
?是子域名,一個域名在允許的情況下可以有不限數(shù)量的子域名。phodal.com
?代表了一個URL是phodal.com下面的域名80
?80是指80端口,默認的都是80,對于一個不是80端口的URL應該是這樣的http://iot-coap.phodal.com:8896/
athome
?指的是虛擬目錄部分,或者文件路徑1.json
看上去就是一個文件名,然而也代表著這是一個資源。對就一個稍微復雜點的例子就是
http://designiot.phodal.com/#你所沒有深入的http
這里的#
后面是錨部分,如果你打開這個URL就會發(fā)現(xiàn)會直接跳轉到相應的錨部分,對就于下面這樣的一個例子來說
http://www.phodal.com/search/?q=iot&type=blog
?
后面的q=iot&type=blog
的部分是參數(shù)部分,通常用于查詢或者、搜索。
當我們打開最小物聯(lián)網(wǎng)系統(tǒng)的一個頁面時,如http://b.phodal.com/athome/1.json
我們在瀏覽器上看到的結果是
[
{
"id": 1,
"temperature": 19,
"sensors1": 31,
"sensors2": 7.5,
"led1": 0
}
]
只是我們看到的是結果,忽略了這其中的過程,于是我們用curl^curl命令來看看詳細的情況。
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命令向服務器發(fā)起了GET請求,服務器返回了上面的結果。
一個HTTP響應由三部分組成
在上面的結果中,狀態(tài)行是
HTTP/1.1 200 OK
返回的狀態(tài)碼是200,OK是狀態(tài)碼的原因短語。
如果是一個跳轉的頁面,它就可能是下面的結果:
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)又有所細分,提一下這五種狀態(tài),詳細可參見http://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81
如
在這次響應中,返回了兩個報頭,即
Content-Type: application/json
Date: Fri, 05 Sep 2014 15:05:49 GMT
Content-Type和Date,在這里的Context-Type是application/json,而通常情況下我們打開一個網(wǎng)站時,他的Content-Type應該是text/html。
Content-Type: text/html;
Content-Type是最重要的報頭。
正文才是我們真正想要的內容,上面的都是寫給瀏覽器看的,一般的人不會去關注這些。
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寫的,而對于一個網(wǎng)站的時候則是HTML,如:
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
</body>
</html>
那么這次GET請求返回的就是:
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>
雖然與第一次請求的結果在游覽器上看似乎是一樣的(ps:可能有微小的差異),然而其本質是不同的。
推薦及參考書目:
[^URL]: URL 是 URI 的子集
更多建議: