1. 程式人生 > >淺談HTTP協議

淺談HTTP協議

其他 沒有 not ref 小寫 dir 子類 使用 val

1 HTTP概念

把握三個點:
1 HTTP協議(超文本傳輸協議)   HTTP是一個基於TCP/IP通信協議來傳遞數據,默認端口80
2 HTTP是無連接(限制每次連接只處理一個請求),無狀態的(對於事務處理沒有記憶能力)
3 HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和建立連接。

2 HTTP協議結構

HTTP是基於客戶端/服務端(C/S)的架構模型,通過一個可靠的鏈接來交換信息,是一個無狀態的請求/響應協議。流程大致 : web Browser -- HTTP Protocol -- HTTP Server -- CGI Program -- Database

  客戶端 c:request
  請求行  request line    請求方法  url  協議版本  
  請求頭  header  頭部字段名 : 值
  
  請求主體
    例如
    GET /hello.txt HTTP/1.1
    User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
    Host: www.example.com
    Accept-Language: en, mi

  服務端 s:response
  狀態行   HTTP/1.1  200  OK   協議   狀態碼  註釋
  消息報頭  Date  Content-Type  content-Lnegth

  響應正文 content
    例如:
    HTTP/1.1 200 OK
    Date: Mon, 27 Jul 2009 12:28:53 GMT
    Server: Apache
    Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
    ETag: "34aa387-d-1568eb00"
    Accept-Ranges: bytes    
    Content-Length: 51
    Vary: Accept-Encoding
    Content-Type: text/plain    

3 HTTP協議請求方式

PUT   創建資源
      從客戶端向服務器傳送的數據取代指定的文檔的內容。
POST  更新資源
      post請求有消息體,可以攜帶大量數據,數據放在消息體中
GET   獲取資源
      get請求無消息體,只能攜帶少量數據,數據放在url中
HEAD   獲取報頭資源
OPTIONS  允許客戶端查看服務器的性能。
DELETE   刪除指定頁面資源
TRACE    回顯服務器收到的請求,主要用於測試或診斷
CONNECT  HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。

4 HTTP響應頭信息

Allow   服務器支持的方法
content-encoding   文檔編碼方法
content-length   內容長度
content-type   文檔所屬類型
date   當前的時間
location   客戶端去哪提取文檔
reflesh    瀏覽器應在多少時間刷新文檔
server     服務器名字
set-cookie  設置頁面關聯的cookie
last-modified  文檔最後的改動時間
Host  域名
Date  時間
User-Agent  瀏覽器版本

5 HTTP狀態碼

5 種類型
    1** 信息,服務器收到請求,需要請求者繼續執行操作
    2** 成功,操作被成功接收並處理
    3** 重定向,需要進一步尋找資源
    4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
    5** 服務器錯誤,服務器在處理請求的過程中發生了錯誤
常見的http狀態碼
    200- 請求成功
    301-資源被永久轉移到其他URL
    404 請求資源頁面不在
    500 內部服務器錯誤

6 HTTP對象HttpRequest

HttpRequest代表來自客戶端的Http請求

原理:request與response是頁面發生請求時,Django內置模塊把data數據包裝成HttpRequest對象,然後Django加載合適的view方法,將HttpRequest對象作為第一個參數傳給view方法,則其返回的結果就是HttpResponse對象.

HttpRequest屬性列表:

path      請求頁面的全路徑,不包括域名—例如, "/django/student/"
method    請求類型,大寫表示, GET,POST 等
GET       包含所有HTTP GET參數的Queryset對象,獲取通過找到key獲取value
POST      包含所有HTTP POST參數的Queryset對象,獲取通過找到key獲取value
COOKIES   包含所有cookies的Python字典對象,鍵值對Keys和values都是字符串
META      包含所有可用HTTP頭部信息的字典(端口,主機名,主機頭信息等)
FILES     包含所有上傳文件的Queryset對象,對應 <input type="file" name="" />標簽中name屬性的值   
          註意:只有在請求方法是POST,並且在<form>有enctype="multipart/form-data"屬性時FILES才擁有              數據。否則,FILES 為空    

user      是一個django.contrib.auth.models.User 對象,代表當前登錄的用戶,需要引入使用
          from django.contrib.auth import User  實例化 user = User()
          
session   唯一可讀寫的屬性,代表當前會話的字典對象。只有激活Django中的session支持時該屬性才可用
         當服務器session存儲數據時,可以在request中調用 request.session[‘key‘]

7 HTTP對象HttpResponse

HttpResponse代表來自服務端的Http響應
HttpResquest是由Django自動創建,但是HttpResponse則必須由我們自己創建,每個view方法必須返回一個HttpResponse對象   from django.http.response import HttpResponse

HttpResponse常見的方法

HttpResponse.has_header(header)   判斷響應頭是否有給定的名稱,返回True or False,不區分大小寫
HttpResponse.set_cookie()     通知客戶端設置cookie信息,一般存儲sessionid+value用於session取值
HttpResponse.delete_cookie    清除cookie信息
HttpResponse.write(content)    寫入content至報文中
HttpResponse.flush()    將緩存區的內容寫入報文
HttpResponse.tell()     移動文件中的操作指針

HttpResponse 子類
class HttpResponseRedirect      資源重定向
class HttpResponseNotFound      資源未找到 404
class HttpResponseBadRequest    錯誤請求  400
class HttpResponseForbidden     無權限訪問 403
class HttpResponseServerError   服務器錯誤 500

淺談HTTP協議