HTTP協議與HTML form

 

HTTP協議是應用層協議, 全稱是HyperText Transfer Protocolhtml

HTTP協議是一種請求迴應式的, 一個Request必定會有一個Responsenginx

 

格式web

HTTP的一次請求或者一次應答所發送的包爲一個HTTP Message,  chrome

HTTP Message固然分爲Request和Response, 二者均可以分爲三個部分django

  • 起始行  Start Line
  • 消息頭  Message Headers
  • 消息體  Message Body 或 Message entity

 

 

下面我用chrome作的測試 瀏覽器

 

我在瀏覽器地址欄輸入www.douban.com, 從個人Request中摘取部分服務器

GET / HTTP/1.1
Host: www.douban.com
Connection: keep-alive

請求行有三部分:函數

  • GET              方法,GET和POST是咱們最多見的
  • /                    要請求的資源的URI
  • HTTP/1.1      使用的HTTP協議版本

 

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/1.1   使用的協議版本
  • 200  狀態碼
  • OK   狀態描述, 計算機並不解析這個,這是給人看的

 

 

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                
  • request header
  • response header
  • entity header

general header修飾整個message, 不分是Request仍是Response, 如

  • Connection:keep-alive

 

request header修飾Request, 如:

  • Host: www.douban.com
  • User-Agent : .....
  • Cookie : .....

 

response header修飾Response, 如:

  • Server : nginx

 

entity header 修飾 Message body, 如:

  • Content-Length : 
  • Content-Type : text/html; charset=utf-8

 

對於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/

相關文章
相關標籤/搜索