http協議

一 HTTP概述

HTTP(hypertext transport protocol),即超文本傳輸協議。這個協議詳細規定了瀏覽器和萬維網服務器之間互相通訊的規則。html

HTTP就是一個通訊規則,通訊規則規定了客戶端發送給服務器的內容格式,也規定了服務器發送給客戶端的內容格式。其實咱們要學習的就是這個兩個格式!客戶端發送給服務器的格式叫「請求協議」;服務器發送給客戶端的格式叫「響應協議」。web

特色:瀏覽器

  • HTTP叫超文本傳輸協議,基於請求/響應模式的!
  • HTTP是無狀態協議,FTP是有狀態。

URL:統一資源定位符,就是一個網址:協議名://域名:端口/路徑緩存

二 請求協議

請求首行;  // 請求方式 請求路徑 協議和版本,例如:GET /index.html HTTP/1.1
請求頭信息;// 請求頭名稱:請求頭內容,即爲key:value格式,例如:Host:localhost
空行;     // 用來與請求體分隔開
請求體。   // GET沒有請求體,只有POST有請求體。

瀏覽器發送給服務器的內容就這個格式的,若是不是這個格式服務器將沒法解讀!在HTTP協議中,請求有不少請求方法,其中最爲經常使用的就是GET和POST。不一樣的請求方法之間的區別,後面會一點一點的介紹。服務器

2.1 GET請求

HTTP默認的請求方法就是GET
* 沒有請求體
* 數據必須在1K以內!
* GET請求數據會暴露在瀏覽器的地址欄中網絡

GET請求經常使用的操做:
\1. 在瀏覽器的地址欄中直接給出URL,那麼就必定是GET請求
\2. 點擊頁面上的超連接也必定是GET請求
\3. 提交表單時,表單默認使用GET請求,但能夠設置爲POST併發

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Cookie:csrftoken=z5H43ZwARx7AIJ82OEizBOWbsAQA2LPk
Host:127.0.0.1:8090
Pragma:no-cache
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36
Name
login/
1 requests ❘ 737 B transferred ❘ Finish: 5 ms ❘ DOMContentLoaded: 14 ms ❘ Load: 14 ms
  • GET 127.0.0.1:8090/login HTTP/1.1:GET請求,請求服務器路徑爲 127.0.0.1:8090/login ,協議爲1.1;
  • Host:localhost:請求的主機名爲localhost;
  • *User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0:與瀏覽器和OS相關的信息。有些網站會顯示用戶的系統版本和瀏覽器版本信息,這都是經過獲取User-Agent頭信息而來的;
  • Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8:告訴服務器,當前客戶端能夠接收的文檔類型,其實這裏包含了/,就表示什麼均可以接收;
  • Accept-Language: zh-cn,zh;q=0.5:當前客戶端支持的語言,能夠在瀏覽器的工具選項中找到語言相關信息;
  • Accept-Encoding: gzip, deflate:支持的壓縮格式。數據在網絡上傳遞時,可能服務器會把數據壓縮後再發送;
  • Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7:客戶端支持的編碼;
  • Connection: keep-alive:客戶端支持的連接方式,保持一段時間連接,默認爲3000ms;
  • Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:由於不是第一次訪問這個地址,因此會在請求中把上一次服務器響應中發送過來的Cookie在請求中一併發送去過;這個Cookie的名字爲JSESSIONID,而後在講會話是講究它!

2.2 POST請求

(1). 數據不會出如今地址欄中
(2). 數據的大小沒有上限
(3). 有請求體
(4). 請求體中若是存在中文,會使用URL編碼!app

username=%E5%BC%A0%E4%B8%89&password=123
咱們都知道Http協議中參數的傳輸是"key=value"這種簡直對形式的,若是要傳多個參數就須要用「&」符號對鍵值對進行分割。如"?name1=value1&name2=value2",這樣在服務端在收到這種字符串的時候,會用「&」分割出每個參數,而後再用「=」來分割出參數值。

 

針對「name1=value1&name2=value2」咱們來講一下客戶端到服務端的概念上解析過程: 
上述字符串在計算機中用ASCII嗎表示爲: 
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。 
6E616D6531:name1 
3D:= 
76616C756531:value1 
26:&
6E616D6532:name2 
3D:= 
76616C756532:value2 
服務端在接收到該數據後就能夠遍歷該字節流,首先一個字節一個字節的吃,當吃到3D這字節後,服務端就知道前面吃得字節表示一個key,再想後吃,若是遇到26,說明從剛纔吃的3D到26子節之間的是上一個key的value,以此類推就能夠解析出客戶端傳過來的參數。

如今有這樣一個問題,若是個人蔘數值中就包含=或&這種特殊字符的時候該怎麼辦。 
好比說「name1=value1」,其中value1的值是「va&lu=e1」字符串,那麼實際在傳輸過程當中就會變成這樣「name1=va&lu=e1」。咱們的本意是就只有一個鍵值對,可是服務端會解析成兩個鍵值對,這樣就產生了奇異。

如何解決上述問題帶來的歧義呢?解決的辦法就是對參數進行URL編碼 
URL編碼只是簡單的在特殊字符的各個字節前加上%,例如,咱們對上述會產生奇異的字符進行URL編碼後結果:「name1=va%26lu%3D」,這樣服務端會把緊跟在「%」後的字節當成普通的字節,就是不會把它當成各個參數或鍵值對的分隔符。

使用表單能夠發POST請求,但表單默認是GETjsp

<form action="" method="post">
  關鍵字:<input type="text" name="keyword"/>
  <input type="submit" value="提交"/>
</form>

輸入yuan後點擊提交,查看請求內容以下:工具

Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:13
Content-Type:application/x-www-form-urlencoded
Cookie:csrftoken=z5H43ZwARx7AIJ82OEizBOWbsAQA2LPk
Host:127.0.0.1:8090
Origin:http://127.0.0.1:8090
Pragma:no-cache
Referer:http://127.0.0.1:8090/login/
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36

Form Data
username:yuan

POST請求是能夠有體的,而GET請求不能有請求體。

 響應協議

3.1 響應內容

響應協議的格式以下:

響應首行;
響應頭信息;
空行;
響應體。

響應內容是由服務器發送給瀏覽器的內容,瀏覽器會根據響應內容來顯示。遇到會開一個新的線程加載,因此有時圖片多的話,內容會先顯示出來,而後圖片才一張張加載出來。

Request URL:http://127.0.0.1:8090/login/
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:8090
Response Headers
view source
Content-Type:text/html; charset=utf-8
Date:Wed, 26 Oct 2016 06:48:50 GMT
Server:WSGIServer/0.2 CPython/3.5.2
X-Frame-Options:SAMEORIGIN

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login/" method="post">
  用戶名:<input type="text" name="username"/>
  <input type="submit" value="提交"/>
</form>    
</body>
</html>
  • HTTP/1.1 200 OK:響應協議爲HTTP1.1,狀態碼爲200,表示請求成功,OK是對狀態碼的解釋;
  • Server:WSGIServer/0.2 CPython/3.5.2:服務器的版本信息;
  • Content-Type: text/html;charset=UTF-8:響應體使用的編碼爲UTF-8;
  • Content-Length: 724:響應體爲724字節;
  • Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:響應給客戶端的Cookie;
  • Date: Wed, 25 Sep 2012 04:15:03 GMT:響應的時間,這可能會有8小時的時區差;

3.2 狀態碼

200:請求成功,瀏覽器會把響應體內容(一般是html)顯示在瀏覽器中;

404:請求的資源沒有找到,說明客戶端錯誤的請求了不存在的資源;

500:請求資源找到了,但服務器內部出現了錯誤;

302:重定向,當響應碼爲302時,表示服務器要求瀏覽器從新再發一個請求,服務器會發送一個響應頭Location,它指定了新請求的URL地址;

304:

當用戶第一次請求index.html時,服務器會添加一個名爲Last-Modified響應頭,這個頭說明了
  index.html的最後修改時間,瀏覽器會把index.html內容,以及最後響應時間緩存下來。當用戶第
  二次請求index.html時,在請求中包含一個名爲If-Modified-Since請求頭,它的值就是第一次請
  求時服務器經過Last-Modified響應頭髮送給瀏覽器的值,即index.html最後的修改時間,
  If-Modified-Since請求頭就是在告訴服務器,我這裏瀏覽器緩存的index.html最後修改時間是這個,
  您看看如今的index.html最後修改時間是否是這個,若是仍是,那麼您就不用再響應這個index.html
  內容了,我會把緩存的內容直接顯示出來。而服務器端會獲取If-Modified-Since值,與index.html
  的當前最後修改時間比對,若是相同,服務器會發響應碼304,表示index.html與瀏覽器上次緩存的相
  同,無需再次發送,瀏覽器能夠顯示本身的緩存頁面,若是比對不一樣,那麼說明index.html已經作了修
  改,服務器會響應200。

img

3.3 其餘響應頭

告訴瀏覽器不要緩存的響應頭:

  • Expires: -1;
  • Cache-Control: no-cache;
  • Pragma: no-cache;

自動刷新響應頭,瀏覽器會在3秒以後請求http://www.baidu.com:

3.4 HTML中指定響應頭

在HTMl頁面中可使用 來指定響應頭,例如在index.html頁面中給出 ,表示瀏覽器只會顯示index.html頁面3秒,而後自動跳轉到http://www.baidu.com.

相關文章
相關標籤/搜索