RESTful介紹

web框架的本質:
    socket服務端與瀏覽器的通訊
    socket(套接字):進程間的一種通訊方式  
 socket服務端功能劃分:
    a.負責與瀏覽器收發消息(socket通訊)  --------》wsgiref/uWsgi
    b.根據用戶訪問不一樣的路徑執行不一樣的函數
    c.從HTML讀取出內容,而且完成字符串的替換     ----》jinja2(模板語言)
 
在python中web框架的分類
   框架自帶a,b,c                                -------》Tornado 框架
   框架自帶b,c,使用第三方的a          -------》Django 框架
   框架自帶b,使用第三方的a和c        -------》 Flask  框架
 
web 應用模式:
  先後端不分離:前端頁面看到的效果都是由後端控制,由後端頁面渲染或者重定向,適合純網頁應用
  先後端分離: 後端僅返回前端所需的數據,不在渲染HTMl頁面,再也不控制前端的效果
        在先後端分離的應用模式中,將後端開發的每個視圖都稱之爲接口,或者API,前端經過訪問接口來對數據進程增刪改查
 
RSET:表象話狀態轉變(表述行狀態轉變)
   什麼是表述性:就是指客戶端請求一個資源,服務器拿到這個資源,就是表述
   資源的地址在Web中就是URL(統一資源標識符)
   資源是REST系統的核心概念,全部的設計都是以資源爲核心
    
REST架構的主要原則
   1. 對網絡上的全部資源獨有一個資源標誌符  --------》資源
  2.  對資源的操做不會改變標識符                   --------》統一資源
  3. 同一資源有多種表現形式         ---------》URL
  4. 全部的操做都是無狀態的         --------》 無狀態
符合上述RSET原則的架構就是RSETful
RESTful:一種常見的REST應用,是遵循REST風格的Web服務,REST式的Web服務是一種ROA(面向資源的)架構
RESTful的設計方法:
  1.域名 將api(應用程序編程接口)部署在專用域名之下
  
https://api.XXXXX.com

  2.版本html

    方法1:將API的版本號放入URL中前端

      
http://www.xxxx.com/app/1.0/foo

http://www.xxxxx.com/app/1.1/foo
     方法2:將版本號放在HTTP頭信息中,版本號在HTTP請求頭信息的Accept字段中進行區分,詳見:http://www.informit.com/articles/article.aspx?p=1566460
Accept: vnd.example-com.foo+json; version=1.0

Accept: vnd.example-com.foo+json; version=1.1

  3. 路徑java

  路徑又稱"終點",表示API的具體網址,且每個網址表明一中資源python

  (1)資源做爲網址,只能有名詞,不能有動詞,並且全部的名詞與數據庫的表名相對應git

  (2) API中的名詞應該使用複數,不管子資源或者全部資源github

例如;左邊是錯誤的,右邊是正確的web

GET /rest/api/getDogs --> GET /rest/api/dogs 獲取全部小狗狗 
GET /rest/api/addDogs --> POST /rest/api/dogs 添加一個小狗狗 
GET /rest/api/editDogs/:dog_id --> PUT /rest/api/dogs/:dog_id 修改一個小狗狗 
GET /rest/api/deleteDogs/:dog_id --> DELETE /rest/api/dogs/:dog_id 刪除一個小狗狗  

  (3)HTTP動詞數據庫

     對於資源的具體操做類型,由HTTP動詞表示編程

     經常使用的HTTP動詞有下面四個(括號裏對應的是SQL命令)    json

      GET(SELECT):從服務器取出資源(一項或多項)

      POST(CREATE):在服務器新建一個資源。

      PUT(UPDATE):在服務器更新資源(客戶端提供改變後的完整資源)。

      DELETE(DELETE):從服務器刪除資源。

     還有三個不經常使用的HTTP動詞。

        PATCH(UPDATE):在服務器更新(更新)資源(客戶端提供改變的屬性)。

        HEAD:獲取資源的元數據。

        OPTIONS:獲取信息,關於資源的哪些屬性是客戶端能夠改變的。

   4. 過濾信息(Filtering)

    若是記錄數量不少,服務器不可能將他們返回給用戶,API應該提供參數,過濾返回結果

    常見的參數有:  

?limit=10:指定返回記錄的數量
?offset=10:指定返回記錄的開始位置。
?page=2&per_page=100:指定第幾頁,以及每頁的記錄數。
?sortby=name&order=asc:指定返回結果按照哪一個屬性排序,以及排序順序。
?animal_type_id=1:指定篩選條件

   5. 狀態碼(Status Codes)

   服務器向用戶返回的狀態碼和提示信息,常見的有(方括號中的狀態碼是對應的HTTP動詞): 

200 OK - [GET]:服務器成功返回用戶請求的數據
201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。
202 Accepted - [*]:表示一個請求已經進入後臺排隊(異步任務)
204 NO CONTENT - [DELETE]:用戶刪除數據成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操做
401 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。
403 Forbidden - [*] 表示用戶獲得受權(與401錯誤相對),可是訪問是被禁止的。
404 NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操做,該操做是冪等的。
406 Not Acceptable - [GET]:用戶請求的格式不可得(好比用戶請求JSON格式,可是隻有XML格式)。
410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再獲得的。
422 Unprocesable entity - [POST/PUT/PATCH] 當建立一個對象時,發生一個驗證錯誤。
500 INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將沒法判斷髮出的請求是否成功。

  狀態碼的徹底列表參見:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

  6.錯誤處理(Error handling)
     若是裝狀態碼是4XX,服務器就應該向用戶返回出錯信息,返回的信息將error做爲鍵名,出錯信息爲鍵值便可
{
    error: "Invalid API key"
}

  7. 返回結果

  針對不一樣操做,服務器向用戶返回的結果應該符合如下規範。

  • GET /collection:返回資源對象的列表(數組)
  • GET /collection/resource:返回單個資源對象
  • POST /collection:返回新生成的資源對象
  • PUT /collection/resource:返回完整的資源對象
  • PATCH /collection/resource:返回完整的資源對象
  • DELETE /collection/resource:返回一個空文檔
   8. 超媒體(Hypermedia API)
  RESTful API最好作到Hypermedia(即返回結果中提供連接,連向其餘API方法),使得用戶不查文檔,也知道下一步應該作什麼。
  在這裏能夠訪問  https://api.github.com 作示範
  
  9.其餘
  服務器返回的數據格式。儘可能使用JSON
 
關於REST API  具體描述:https://developer.github.com/v3/
RESTful 認證機制參考:https://www.cnblogs.com/chinajava/p/5871305.html
相關文章
相關標籤/搜索