HTTP協議是應用層協議, 全稱是HyperText Transfer Protocolhtml
HTTP協議是一種請求迴應式的, 一個Request必定會有一個Responsenginx
格式web
HTTP的一次請求或者一次應答所發送的包爲一個HTTP Message, chrome
HTTP Message固然分爲Request和Response, 二者均可以分爲三個部分django
下面我用chrome作的測試 瀏覽器
我在瀏覽器地址欄輸入www.douban.com, 從個人Request中摘取部分服務器
GET / HTTP/1.1 Host: www.douban.com Connection: keep-alive
請求行有三部分:函數
GET 請求是不會有Message Body的 post
我在請求www.douban.com後, 豆瓣服務器返回的Response中, 摘取狀態行和部分header fields測試
HTTP/1.1 200 OK Server: nginx Content-Type: text/html; charset=utf-8 Content-Length: 15597 Connection: keep-alive
Response的狀態行有三段:
HTTP 與 form元素
URI
URI就是Uniform Resource Identifier, 用來定位web上的惟一資源, 而這個Request就是針對對這個資源實施的. <關於URI及其相關的名稱其實不少, 對於有有些強迫症患者,確實要考究其準肯定義,能夠參考 RFC2396 和 RFC2616>
URI能夠帶query parameter請求參數, 就是?以後的部分
當咱們用豆瓣的搜索,在豆瓣網任何地方搜索"world", Request請求行以下
GET /search?source=suggest&q=world HTTP/1.1
搜索框的部分是一個<form>,其html爲(丟掉不相關的部分)
<form action="http://www.douban.com/search" method="get"> <input type="hidden" name="source" value="suggest"> <input name="q" > </form>
能夠看到這個<form>屬性 method="get" , 它指示Request使用GET方法, <form>中的參數會被放到URI的 ?query 部分.
[??]那若是<form>的 method="post" 會是什麼狀況呢
用http://www.douban.com/accounts/login 頁面測試, 賬號密碼固然不能顯示在URI中了. Request爲(去掉不太相關的)
POST /accounts/login HTTP/1.1
Host: www.douban.com
Connection: keep-alive
Content-Length: 51
form_email=wangyu%40gmail.com&form_password=1234567
這裏是以字節的ASCII碼來顯示的, "%40"指的 "@"
能夠看到<form>中的數據放到了Request的body裏面, Request的方法爲POST
方法爲POST的Request是有body的, body就是 &分隔的一個個 key-value
HTTP Message Headers
headers的keys是預先定義好的, 作爲協議的一部分,都有各自的用途, 咱們不能在headers中本身加名字. 固然POST的數據不會放在headers中了
headers分爲4類
general header修飾整個message, 不分是Request仍是Response, 如
request header修飾Request, 如:
response header修飾Response, 如:
entity header 修飾 Message body, 如:
對於Message headers, 協議並無規定順序, 可是協議上建議以上面的分類的順序寫.
Django的HttpRequest
若是用Django咱們會知道, 每一次請求都會被django封裝在一個request傳進咱們的函數
request是一個HttpRequest類對象, 定義在django.http.request模塊中, 封裝了一個HTTP Request的信息
HttpRequest的__init__函數:
def __init__(self): self.GET, self.POST, self.COOKIES, self.META, self.FILES = {}, {}, {}, {}, {} self.path = ''
能夠看到這裏有五個字典
request.GET中是URI的query參數
當請求方法爲POST時, 其body中的key-value值會放在request.POST中
request.META 中存放了Request Headers.
--------------
參考:
RFC2616中描述了HTTP/1.1 , 不少東西都是在上面看的 http://tools.ietf.org/html/rfc2616
Django的Request and Response https://docs.djangoproject.com/en/1.6/ref/request-response/