關于RESTful一些注意事項,接口開發規范

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

最近在研究restful,公司開發要使用,所以自己就去網上找了好些資料,并整理了一套公司開發的接口規范。當然,我也只是剛剛入坑。還不是很全面。但是這就是一個過程。一點點,總會好起來的。以下是就是RESTful接口規范:

一、???URI

URI規范

1.不用大寫;

2.用中杠?-?不用下杠?_?

3.參數列表要encode

4.URI中的名詞表示資源集合,使用復數形式。

5.RESTful架構中,每個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞(特殊情況可以使用動詞),而且所用的名詞往往與數據庫的表格名對應

?

資源集合?vs單個資源

URI表示資源的兩種方式:資源集合、單個資源

資源集合:

?????? /zoos //所有動物園

?????? /zoos/1/animals //id1的動物園中的所有動物

單個資源:

?????? /zoos/1//id1的動物園

?????? /zoos/1;2;3//id123的動物園

?

避免層級過深的URI

url中表達層級,用于?按實體關聯關系進行對象導航?,一般根據id導航。

過深的導航容易導致url膨脹,不易維護,如?GET /zoos/1/areas/3/animals/4?,盡量使用查詢參數代替路徑中的實體導航,如?GET/animals?zoo=1&area=3?

?

?

二、???版本

應該將API的版本號放入到URI

???????????https://api.example.com/v1/zoos

?

?

三、?Request

HTTP方法

通過標準HTTP方法對資源CRUD

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

GET /zoos

GET /zoos/1

GET/zoos/1/employees

POST:創建單個新資源。?POST一般向資源集合uri發起

POST/animals? //新增動物

POST/zoos/1/employees //id1的動物園雇傭員工

PUT:更新單個資源(全量),客戶端提供完整的更新后的資源。與之對應的是?PATCHPATCH負責部分更新,客戶端提供要更新的那些字段。?PUT/PATCH一般向單個資源uri發起

PUT/animals/1

PUT /zoos/1

DELETE:刪除

DELETE/zoos/1/employees/2

DELETE/zoos/1/employees/2;4;5

DELETE/zoos/1/animals? //刪除id1的動物園內的所有動物

HEAD / OPTION/ PATCH用的不多,就不多解釋了。

HEAD:獲取資源的元數據

OPTIONS:獲取信息,關于資源的哪些屬性是客戶端可以改變的

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

?

安全性和冪等性

1.?????安全性?:不會改變資源狀態,可以理解為只讀的;

2.?????冪等性?:執行1次和執行N次,對資源狀態改變的效果是等價的。

.

安全性

冪等性

GET

POST

×

×

PUT

×

DELETE

×

安全性和冪等性均不保證反復請求能拿到相同的response。以?DELETE為例,第一次DELETE返回200表示刪除成功,第二次返回404提示資源不存在,這是允許的。

復雜查詢

查詢可以捎帶以下參數:

.

示例

備注

過濾條件

?type=1&age=16

允許一定的uri冗余,如?/zoos/1??/zoos?id=1

排序

?sort=age&order=asc

指定返回結果按照哪個屬性排序,以及排序順序

投影

?whitelist=id,name,email

分頁

? page=2&per_page=100

指定第幾頁,以及每頁的記錄數

Bookmarker

經常使用的、復雜的查詢標簽化,降低維護成本。

如:GET /trades?status=closed&sort=created,desc

快捷方式:GET /trades#recently-closed或者GET /trades/recently-closed

狀態碼

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

§200 OK - [GET]:服務器成功返回用戶請求的數據,該操作是冪等的(Idempotent)。

§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 - [*]:服務器發生錯誤,用戶將無法判斷發出的請求是否成功。

狀態碼的完全列表參見這里

?

URI失效

隨著系統發展,總有一些API失效或者遷移,對失效的API,返回404 not found??410 gone;對遷移的API,返回?301重定向。

?

四、Response

1.????不要包裝:

response?body?直接就是數據,不要做多余的包裝。錯誤示例:

{

???"success":true,

???"data":{"id":1,"name":"xiaotuan"},

}

2.????HTTP方法成功處理后的數據格式:

·

response 格式

GET

單個對象、集合

POST

新增成功的對象

PUT/PATCH

更新成功的對象

DELETE

?

五、錯誤處理

1.?????不要發生了錯誤但給2xx響應,客戶端可能會緩存成功的http請求;

2.?????正確設置http狀態碼,不要自定義;

3.?????Response body提供

:返回的信息中將error作為鍵名,出錯信息作為鍵值即可

1)錯誤的代碼(日志/問題追查);

2)錯誤的描述文本(展示給用戶)。

?

對第三點的實現稍微多說一點:

Java服務器端一般用異常表示?RESTful API的錯誤。API?可能拋出兩類異常:業務異常和非業務異常。?業務異常?由自己的業務代碼拋出,表示一個用例的前置條件不滿足、業務規則沖突等,比如參數校驗不通過、權限校驗失敗。?非業務類異常?表示不在預期內的問題,通常由類庫、框架拋出,或由于自己的代碼邏輯錯誤導致,比如數據庫連接失敗、空指針異常、除0錯誤等等。

業務類異常必須提供2種信息:

1.?????如果拋出該類異常,HTTP響應狀態碼應該設成什么;

2.?????異常的文本描述;

Controller層使用統一的異常攔截器:

1.?????設置?HTTP響應狀態碼:對業務類異常,用它指定的?HTTPcode;對非業務類異常,統一500

2.?????Response Body的錯誤碼:異常類名

3.?????Response Body的錯誤描述:對業務類異常,用它指定的錯誤文本;對非業務類異常,線上可以統一文案如服務器端錯誤,請稍后再試,開發或測試環境中用異常的?stacktrace,服務器端提供該行為的開關。

常用的http狀態碼及使用場景:

狀態碼

使用場景

400 bad request

常用在參數校驗

401 unauthorized

未經驗證的用戶,常見于未登錄。如果經過驗證后依然沒權限,應該?403(即?authenticationauthorization的區別)。

403 forbidden

無權限

404 not found

資源不存在

500 internal server error

非業務類異常

503 service unavaliable

由容器拋出,自己的代碼不要拋這個異常

?

六、其他

1API的身份認證應該使用OAuth2.0框架

2)服務器返回的數據格式,應該盡量使用JSON,避免使用XML

3)比較復雜的接口不能確定是使用POST還是PUT時,要看具體的業務層代碼,看看接口產生的結果是否冪等,如果冪等用PUT,相反用POST

??????如:接口接收到一資源,資源存在更新,不存在插入新數據,這個接口就要用PUT

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450782.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【老杜】MySQL—day01

文章目錄day01課堂筆記1、數據庫概述及數據準備1.1、什么是數據庫1.2、什么是數據庫管理系統1.3、SQL概述1.4、安裝MySQL數據庫管理系統。1.4、MySQL數據庫的完美卸載!1.5、MySQL的服務1.6、用命令來啟動和關閉mysql服務1.7、登錄mysql數據庫2、MySQL常用命令&#…

【轉載】DRuid 大數據分析之查詢

轉載自http://yangyangmyself.iteye.com/blog/23217591、Druid 查詢概述上一節完成數據導入后,接下來講講Druid如何查詢及統計分析導入的數據。Druid的查詢是使用REST風格的HTTP請求查詢服務節點(Broker、Historical、Realtime),這…

記錄 Parameter with that position [1] did not exist; nested exception is java.lang.IllegalArgumentExce

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯如題: Parameter with that position [1] did not exist; nested exception is java.lang.IllegalArgumentException: Pa…

[轉]簡單的動態修改RDLC報表頁邊距和列寬的方法

本文轉自:http://star704983.blog.163.com/blog/static/136661264201161604413204/ 1.修改頁邊距 XmlDocument XMLDoc new XmlDocument();XMLDoc.Load(System.Windows.Forms.Application.StartupPath "\Report_try-2.rdlc");XmlNamespaceManager xmn n…

函數式編程語言天生就慢嗎?

摘要:近期,函數式編程得到了越來越多的關注,Lisp不僅重獲青春還涌現出了一批新函數式編程語言。因此開發者們對函數式編程語言的運行快慢各抒己見,展開激烈討論。本文將和大家一起討論,函數式編程語言真的就慢嗎&#…

【老杜】MySQL—day02

文章目錄day02課堂筆記1、把查詢結果去除重復記錄【distinct】10、連接查詢10.1、什么是連接查詢?10.2、連接查詢的分類?10.3、當兩張表進行連接查詢時,沒有任何條件的限制會發生什么現象?10.4、怎么避免笛卡爾積現象?…

vue根據數組對象中某個唯一標識去重

由于在vue中,會自動在數組和對象中加入_obser__觀察者模式的一些屬性,所以直接用數組的filter去重(下面這種),indexOf不能準確識別 var arr [1, 2, 2, 3, 4, 5, 5, 6, 7, 7]; var arr2 arr.filter(function(x, index…

Springsecurity之AuthenticationProvider

2019獨角獸企業重金招聘Python工程師標準>>> 注意:AuthenticationProvider與Authentication緊密聯系,關于Authentication,看我的這篇博客。 先上一張圖,如下圖1 圖1 AuthenticationProvider的類圖 AuthenticationProvi…

Postman使用入門

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Postman測試管理的單位是測試集(Collections),測試集內可以創建文件夾(Folder)和具體的請求(Requests…

編程需要知道多少數學知識?

摘要:許多人認為在開始學習編程之前必須對數學很在行或者數學分數很高。但一個人為了編程的話,需要學習多少數學呢? 實際上不需要很多 。這篇文章中我會深入探討編程中所需要的數學知識。 下面是我在reddit的子論壇 r/learnprogramming 看到的…

HDU 6071 Lazy Running

鏈接HDU 6071 Lazy Running 給出四個點1,2,3,4,1和2,2和3,3和4,4和1之間有路相連,現在從2點出發,最后回到2點,要求路徑大于等于\(K\),問路徑長度最…

vue彈窗插件實戰

vue做移動端經常碰到彈窗的需求, 這里寫一個功能簡單的vue彈窗 popup.vue <template><div class"popup-wrapper" v-show"visible" click"hide"><div class"popup-text">{{text}}</div></div> </temp…

【狂神說】Redis筆記

文章目錄1、Nosql概述1.1 為什么要用Nosql1.2 什么是NoSQL1.3 阿里巴巴演進分析2、NoSQL的四大分類3、Redis入門3.1 概述3.2 Windows安裝3.3 Linux安裝3.4 測試性能3.5 基礎的知識4、五大數據類型4.1 Redis-Key4.2 String&#xff08;字符串&#xff09;4.3 List&#xff08;列…

Postman用法說明

見&#xff1a;http://blog.csdn.net/flowerspring/article/details/52774399 Postman用法簡介-Http請求模擬工具 在我們平時開發中&#xff0c;特別是需要與接口打交道時&#xff0c;無論是寫接口還是用接口&#xff0c;拿到接口后肯定都得提前測試一下&#xff0c;這樣的話就…

位、字,字節與KB的關系?

位&#xff1a;我們常說的bit&#xff0c;位就是傳說中提到的計算機中的最小數據單位&#xff1a;說白了就是0或者1&#xff1b;計算機內存中的存儲都是01這兩個東西。 字節&#xff1a;英文單詞&#xff1a;&#xff08;byte&#xff09;&#xff0c;byte是存儲空間的基本計量…

C++ string 介紹

之所以拋棄char *的字符串而選用C標準程序庫中的string類&#xff0c;是因為他和前者比較起來&#xff0c;不必擔心內存是否足夠、字符串長度等等&#xff0c;而且作為一個類出現&#xff0c;他集成的操作函數足以完成我們大多數情況下(甚至是100%)的需要。我們可以用 進行賦…

Linux核心總結

文章目錄1.首先了解一下linux的目錄結構2.linux的基本命令之使用命令開關機3.linux的基本命令之目錄管理1.ls—列出目錄命令2.cd—切換目錄命令3.pwd—查看當前所在目錄命令4.mkdir—創建文件夾命令5.rmdir—刪除文件夾命令6.cp—復制文件命令7.rm—傳說中的刪庫跑路命令8.mv—…

Java多線程系列---“JUC鎖”01之 框架

本章&#xff0c;我們介紹鎖的架構&#xff1b;后面的章節將會對它們逐個進行分析介紹。目錄如下&#xff1a; 01. Java多線程系列--“JUC鎖”01之 框架02. Java多線程系列--“JUC鎖”02之 互斥鎖ReentrantLock06. Java多線程系列--“JUC鎖”03之 Condition條件07. Java多線程系…

IDEA配置jdk (SDK)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 提前安裝jdk&#xff0c;配置環境變量 一、配置jdk 1、依次點開File -->Project Structure&#xff0c;點擊左側標簽頁&#xff0c…