restful-API:錯誤分類處理機制和常用返回http狀態碼


1 需求

REST 目前並沒有一個普遍接受的標准,因此開發者需要自行決定 API 的設計,其中一項決策就是錯誤處理。
比如我們是否應該使用 HTTP 狀態碼來標識錯誤?如何返回表單驗證的結果等等。
 

2 錯誤類型

錯誤可以分為兩種類型:全局錯誤和本地錯誤。
全局錯誤(應由 Web 框架捕獲):
(1)請求了一個不存在的 API—》
(2)無權請求這個 API—〉auth
(3)數據庫連接失敗—>database try except
(4)其他一些沒有預期到的、會終止程序運行的服務端錯誤
 
本地錯誤(和 API 密切相關):
(1)請求參數的字段和類型,表單驗證,
(2)唯一性檢查
(3)其他可預期的錯誤處理
我們需要編寫特定代碼來捕獲這類錯誤,並拋出一個包含提示信息的全局異常,供 Web 框架捕獲並返回給客戶端。
 
Flask 框架就提供了此類全局異常處理機制:
使用 Flask-RESTful 來處理驗證的另一個好處就是沒有必要單獨地處理類似 HTTP 400 錯誤,Flask-RESTful 會來處理這些。
 
自動處理成json,並自定義狀態碼
return { 'task': ‘hello world' }, 201
 

3 返回格式

 

{
Code: 200, 
Message: 'Successful', 
token: '38ce6474a370c3fe84ddf92403bec204cfcbe07b',
data:{ key1: value1}
}

 

{
Status: 1, //數據狀態
Code: 200, 
Message: 'Successful', 
ClientTime: 1473765898, 
ServerTime: 1473765935, 
token: '38ce6474a370c3fe84ddf92403bec204cfcbe07b',
data:{ 
    key1: value1,
    key2: value2,
    key3: {
    [
        name: '小明',
        sex: 1,
    ],[
        name: '小華',
        sex: 1,
    ],[
        name: '小剛',
        sex: 1,
    ]}
}
}
復雜點的

4 常用返回狀態

GET HTTP/1.1 200 OK  正確返回
POST   HTTP/1.1 201  Created 已創建
DELETE HTTP/1.1 204 NO CONTENT  沒有返回體
 
POST HTTP/1.1 400 BadRequest 前端請求失敗,方式參數不對
POST HTTP/1.1 401 No Auth 沒有權限
DELETE HTTP/1.1 403 Forbidden 禁止訪問
POST   HTTP/1.1 404  Not Found 沒有資源頁面
PATCH  HTTP/1.1 422 UnprocessableEntity(不能處理實體,圖片文件等)
 
GET  HTTP/1.1 500 InternalError 服務器內部錯誤

200 和204 的區別
* 如果導航到的URL返回了一個沒有響應體的HTTP/200響應,則頁面將會顯示一個空白文檔(就是一片白色),頁面的URL地址也會變成新指定的URL。
* 如果服務器返回的是一個HTTP/204響應,當前頁面不會有任何變化,就好像根本沒有進行導航操作一樣,頁面的URL地址也保持不變。

 

5 其他需要的返回狀態

1xx:信息響應類,表示接收到請求並且繼續處理
2xx:處理成功響應類,表示動作被成功接收、理解和接受
3xx:重定向響應類,為了完成指定的動作,必須接受進一步處理
4xx:客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行
5xx:服務端錯誤,服務器不能正確執行一個正確的請求

100——客戶必須繼續發出請求
101——客戶要求服務器根據請求轉換HTTP協議版本

200——交易成功
201——提示知道新文件的URL
202——接受和處理、但處理未完成
203——返回信息不確定或不完整
204——請求收到,但返回信息為空
205——服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件
206——服務器已經完成了部分用戶的GET請求

300——請求的資源可在多處得到
301——刪除請求數據
302——在其他地址發現了請求數據
303——建議客戶訪問其他URL或訪問方式
304——客戶端已經執行了GET,但文件未變化
305——請求的資源必須從服務器指定的地址得到
306——前一版本HTTP中使用的代碼,現行版本中不再使用
307——申明請求的資源臨時性刪除

400——錯誤請求,如語法錯誤
401——請求授權失敗
402——保留有效ChargeTo頭響應
403——請求不允許
404——沒有發現文件、查詢或URl
405——用戶在Request-Line字段定義的方法不允許
406——根據用戶發送的Accept拖,請求資源不可訪問
407——類似401,用戶必須首先在代理服務器上得到授權
408——客戶端沒有在用戶指定的餓時間內完成請求
409——對當前資源狀態,請求不能完成
410——服務器上不再有此資源且無進一步的參考地址
411——服務器拒絕用戶定義的Content-Length屬性請求
412——一個或多個請求頭字段在當前請求中錯誤
413——請求的資源大於服務器允許的大小
414——請求的資源URL長於服務器允許的長度
415——請求資源不支持請求項目格式
416——請求中包含Range請求頭字段,在當前請求資源范圍內沒有range指示值,請求也不包含If-Range請求頭字段
417——服務器不滿足請求Expect頭字段指定的期望值,如果是代理服務器,可能是下一級服務器不能滿足請求

500——服務器產生內部錯誤
501——服務器不支持請求的函數
502——服務器暫時不可用,有時是為了防止發生系統過載
503——服務器過載或暫停維修
504——關口過載,服務器使用另一個關口或服務來響應用戶,等待時間設定值較長
505——服務器不支持或拒絕支請求頭中指定的HTTP版本

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM