亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

微服務(wù)指南走北(三):Restful API 設(shè)計(jì)簡(jiǎn)述

TZLLOG / 2878人閱讀

摘要:為了避免的變動(dòng)導(dǎo)致用戶使用中產(chǎn)生意外結(jié)果或調(diào)用失敗,最好強(qiáng)制要求所有訪問(wèn)都需要指定版本號(hào)。請(qǐng)避免提供默認(rèn)版本號(hào),一旦提供,日后想要修改它會(huì)相當(dāng)困難。返回結(jié)果針對(duì)不同操作,服務(wù)器向用戶返回的結(jié)果應(yīng)該符合以下規(guī)范。

API的定義取決于選擇的IPC通信方式,如果是消息機(jī)制(如 AMQP 或者 STOMP),API則由消息頻道(channel)和消息類(lèi)型;如果是使用HTTP機(jī)制,則是基于請(qǐng)求/響應(yīng)(調(diào)用http的url),這里我們先簡(jiǎn)述下RestfulAPI的定義。

設(shè)計(jì)原則 域名

應(yīng)該盡量將API部署在專用域名之下,如:

https://api.example.com

也可以放在主域名下:

https://example.org/api/
版本

放入到頭信息的Accept中
制定版本并在版本之間平緩過(guò)渡對(duì)于設(shè)計(jì)和維護(hù)一套API是個(gè)巨大的挑戰(zhàn)。所以,最好在設(shè)計(jì)之初就使用一些方法來(lái)預(yù)防可能會(huì)遇到的問(wèn)題。
為了避免API的變動(dòng)導(dǎo)致用戶使用中產(chǎn)生意外結(jié)果或調(diào)用失敗,最好強(qiáng)制要求所有訪問(wèn)都需要指定版本號(hào)。請(qǐng)避免提供默認(rèn)版本號(hào),一旦提供,日后想要修改它會(huì)相當(dāng)困難。
最適合放置版本號(hào)的位置URL中,或者是頭信息(HTTP Headers)中在 Accept 段中使用自定義類(lèi)型(content type)與其他元數(shù)據(jù)(metadata)一起提交。

https://api.example.com/v1/
或
Accept: application/vnd.heroku+json; version=3
提供 Request-Id

為每一個(gè)請(qǐng)求響應(yīng)包含一個(gè)Request-Id字段,并使用UUID作為該值。通過(guò)在客戶端、服務(wù)器或任何支持服務(wù)上記錄該值,它能主我們提供一種機(jī)制來(lái)跟蹤、診斷和調(diào)試請(qǐng)求。

路徑 資源名

在RESTful架構(gòu)中,每個(gè)網(wǎng)址代表一種資源(resource),所以網(wǎng)址中不能有動(dòng)詞,只能有名詞,而且所用的名詞往往與數(shù)據(jù)庫(kù)的表格名對(duì)應(yīng)。一般來(lái)說(shuō),數(shù)據(jù)庫(kù)中的表都是同種記錄的”集合”(collection),所以API中的名詞也應(yīng)該使用復(fù)數(shù)。
舉例來(lái)說(shuō),有一個(gè)API提供動(dòng)物園(zoo)的信息,還包括各種動(dòng)物和雇員的信息,則它的路徑應(yīng)該設(shè)計(jì)成下面這樣。

https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees
行為(Actions)

好的末尾不需要為資源指定特殊的行為,但在特殊情況下,為某些資源指定行為卻是必要的。為了描述清楚,在行為前加上一個(gè)標(biāo)準(zhǔn)的actions:

/resources/:resource/actions/:action

如:

/runs/{run_id}/actions/stop
路徑和屬性名

為了和域名命名規(guī)則保持一致,使用小寫(xiě)字母并用-分割路徑名字,例如:

service-api.com/users
service-api.com/app-setups

屬性也使用小寫(xiě)字母,但是屬性名要用下劃線_分割,以便在Javascript中省略引號(hào)。 例如:

service_class: "first"
支持方便的無(wú)id間接引用

在某些情況下,讓用戶提供ID去定位資源是不方便的。例如,一個(gè)用戶想取得他在Heroku平臺(tái)app信息,但是這個(gè)app的唯一標(biāo)識(shí)是UUID。這種情況下,你應(yīng)該支持接口通過(guò)名字和ID都能訪問(wèn),例如:

$ curl https://service.com/apps/{app_id_or_name}
$ curl https://service.com/apps/97addcf0-c182
$ curl https://service.com/apps/www-prod

不要只接受使用名字而放棄了使用id。

最小化路徑嵌套

在一些有父路徑/子路徑嵌套關(guān)系的資源數(shù)據(jù)模塊中,路徑可能有非常深的嵌套關(guān)系,例如:

/orgs/{org_id}/apps/{app_id}/dynos/{dyno_id}

推薦在根(root)路徑下指定資源來(lái)限制路徑的嵌套深度。使用嵌套指定范圍的資源。在上述例子中,dyno屬于app,app屬于org可以表示為:

/orgs/{org_id}
/orgs/{org_id}/apps
/apps/{app_id}
/apps/{app_id}/dynos
/dynos/{dyno_id}
HTTP動(dòng)詞

對(duì)于資源的具體操作類(lèi)型,由HTTP動(dòng)詞表示。
常用的HTTP動(dòng)詞有下面五個(gè)(括號(hào)里是對(duì)應(yīng)的SQL命令):

GET(SELECT):從服務(wù)器取出資源(一項(xiàng)或多項(xiàng))。
POST(CREATE):在服務(wù)器新建一個(gè)資源。
PUT(UPDATE):在服務(wù)器更新資源(客戶端提供改變后的完整資源)。
PATCH(UPDATE):在服務(wù)器更新資源(客戶端提供改變的屬性)。
DELETE(DELETE):從服務(wù)器刪除資源。

一些例子:

GET /zoos:列出所有動(dòng)物園
POST /zoos:新建一個(gè)動(dòng)物園
GET /zoos/ID:獲取某個(gè)指定動(dòng)物園的信息
PUT /zoos/ID:更新某個(gè)指定動(dòng)物園的信息(提供該動(dòng)物園的全部信息)
PATCH /zoos/ID:更新某個(gè)指定動(dòng)物園的信息(提供該動(dòng)物園的部分信息)
DELETE /zoos/ID:刪除某個(gè)動(dòng)物園
GET /zoos/ID/animals:列出某個(gè)指定動(dòng)物園的所有動(dòng)物
DELETE /zoos/ID/animals/ID:刪除某個(gè)指定動(dòng)物園的指定動(dòng)物
過(guò)濾信息

如果記錄數(shù)量很多,服務(wù)器不可能都將它們返回給用戶。API應(yīng)該提供參數(shù),過(guò)濾返回結(jié)果。
下面是一些常見(jiàn)的參數(shù):

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

參數(shù)的設(shè)計(jì)允許存在冗余,即允許API路徑和URL參數(shù)偶爾有重復(fù)。比如,GET /zoo/ID/animals 與 GET /animals?zoo_id=ID 的含義是相同的。

響應(yīng)(Responses) 狀態(tài)碼

服務(wù)器向用戶返回的狀態(tài)碼和提示信息,常見(jiàn)的有以下一些(方括號(hào)中是該狀態(tài)碼對(duì)應(yīng)的HTTP動(dòng)詞):

200 OK - [GET]:服務(wù)器成功返回用戶請(qǐng)求的數(shù)據(jù),該操作是冪等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數(shù)據(jù)成功。
202 Accepted - [*]:表示一個(gè)請(qǐng)求已經(jīng)進(jìn)入后臺(tái)排隊(duì)(異步任務(wù))
204 NO CONTENT - [DELETE]:用戶刪除數(shù)據(jù)成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發(fā)出的請(qǐng)求有錯(cuò)誤,服務(wù)器沒(méi)有進(jìn)行新建或修改數(shù)據(jù)的操作,該操作是冪等的。
401 Unauthorized - [*]:表示用戶沒(méi)有權(quán)限(令牌、用戶名、密碼錯(cuò)誤)。
403 Forbidden - [*] 表示用戶得到授權(quán)(與401錯(cuò)誤相對(duì)),但是訪問(wèn)是被禁止的。
404 NOT FOUND - [*]:用戶發(fā)出的請(qǐng)求針對(duì)的是不存在的記錄,服務(wù)器沒(méi)有進(jìn)行操作,該操作是冪等的。
406 Not Acceptable - [GET]:用戶請(qǐng)求的格式不可得(比如用戶請(qǐng)求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用戶請(qǐng)求的資源被永久刪除,且不會(huì)再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),發(fā)生一個(gè)驗(yàn)證錯(cuò)誤。
500 INTERNAL SERVER ERROR - [*]:服務(wù)器發(fā)生錯(cuò)誤,用戶將無(wú)法判斷發(fā)出的請(qǐng)求是否成功。
提供資源的(UU)ID

在默認(rèn)情況給每一個(gè)資源一個(gè)id屬性。除非有更好的理由,否則請(qǐng)使用UUID。不要使用那種在服務(wù)器上或是資源中不是全局唯一的標(biāo)識(shí),尤其是自動(dòng)增長(zhǎng)的id。
生成小寫(xiě)的UUID格式 8-4-4-4-12,例如:

"id": "01234567-89ab-cdef-0123-456789abcdef"
提供標(biāo)準(zhǔn)的時(shí)間戳

為資源提供默認(rèn)的創(chuàng)建時(shí)間 created_at 和更新時(shí)間 updated_at,例如:

{
  ...
  "created_at": "2012-01-01T12:00:00Z",
  "updated_at": "2012-01-01T13:00:00Z",
  ...
}
使用UTC(世界標(biāo)準(zhǔn)時(shí)間)時(shí)間,用ISO8601進(jìn)行格式化

在接收和返回時(shí)都只使用UTC格式(ISO8601格式的數(shù)據(jù))或者使用時(shí)間戳。,例如:

"finished_at": "2012-01-01T12:00:00Z"

"timestamp": "1472486035"
錯(cuò)誤處理

如果狀態(tài)碼是4xx,就應(yīng)該向用戶返回出錯(cuò)信息。一般來(lái)說(shuō),返回的信息中將error作為鍵名,出錯(cuò)信息作為鍵值即可。

{
    error: "Invalid API key"
}
返回結(jié)果

針對(duì)不同操作,服務(wù)器向用戶返回的結(jié)果應(yīng)該符合以下規(guī)范。

GET /collection:返回資源對(duì)象的列表(數(shù)組)
GET /collection/resource:返回單個(gè)資源對(duì)象
POST /collection:返回新生成的資源對(duì)象
PUT /collection/resource:返回完整的資源對(duì)象
PATCH /collection/resource:返回完整的資源對(duì)象
DELETE /collection/resource:返回一個(gè)空文檔
保證響應(yīng)JSON及最小化

目前為保證響應(yīng)最小化,一般使用json字符串,并且請(qǐng)求中多余的空格會(huì)增加響應(yīng)大小,而且現(xiàn)在很多的HTTP客戶端都會(huì)自己輸出可讀格式("prettify")的JSON。所以最好保證響應(yīng)JSON最小化,例如:

{"beta":false,"email":"alice@heroku.com","id":"01234567-89ab-cdef-0123-456789abcdef","last_login":"2012-01-01T12:00:00Z","created_at":"2012-01-01T12:00:00Z","updated_at":"2012-01-01T12:00:00Z"}

而不是這樣:

{
  "beta": false,
  "email": "alice@heroku.com",
  "id": "01234567-89ab-cdef-0123-456789abcdef",
  "last_login": "2012-01-01T12:00:00Z",
  "created_at": "2012-01-01T12:00:00Z",
  "updated_at": "2012-01-01T12:00:00Z"
}
Hypermedia API

RESTful API最好做到Hypermedia,即返回結(jié)果中提供鏈接,連向其他API方法,使得用戶不查文檔,也知道下一步應(yīng)該做什么。
比如,當(dāng)用戶向api.example.com的根目錄發(fā)出請(qǐng)求,會(huì)得到這樣一個(gè)文檔。

{"link": {
  "rel":   "collection https://www.example.com/zoos",
  "href":  "https://api.example.com/zoos",
  "title": "List of zoos",
  "type":  "application/vnd.yourformat+json"
}}

上面代碼表示,文檔中有一個(gè)link屬性,用戶讀取這個(gè)屬性就知道下一步該調(diào)用什么API了。rel表示這個(gè)API與當(dāng)前網(wǎng)址的關(guān)系(collection關(guān)系,并給出該collection的網(wǎng)址),href表示API的路徑,title表示API的標(biāo)題,type表示返回類(lèi)型。
Hypermedia API的設(shè)計(jì)被稱為HATEOAS。Github的API就是這種設(shè)計(jì),訪問(wèn)api.github.com會(huì)得到一個(gè)所有可用API的網(wǎng)址列表。

{
  "current_user_url": "https://api.github.com/user",
  "authorizations_url": "https://api.github.com/authorizations",
  // ...
}

從上面可以看到,如果想獲取當(dāng)前用戶的信息,應(yīng)該去訪問(wèn)api.github.com/user,然后就得到了下面結(jié)果。

{
  "message": "Requires authentication",
  "documentation_url": "https://developer.github.com/v3"
}

上面代碼表示,服務(wù)器給出了提示信息,以及文檔的網(wǎng)址。

參考文章

github的restful接口

Restful API淺析 之設(shè)計(jì)原則與案例修正

http-api-design


by 劉迎光@螢火蟲(chóng)工作室
OpenBI交流群:495266201
MicroService 微服務(wù)交流群:217722918
mail: liuyg#liuyingguang.cn
博主首頁(yè)(==防止爬蟲(chóng)==):http://blog.liuyingguang.cn
OpenBI問(wèn)答社區(qū):http://www.openbi.tk

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/26807.html

相關(guān)文章

  • 服務(wù)指南走北(四):你不愿意做服務(wù)架構(gòu)的十個(gè)理由

    摘要:微服務(wù)架構(gòu)模式使得每個(gè)微服務(wù)獨(dú)立部署,且每個(gè)服務(wù)獨(dú)立擴(kuò)展,開(kāi)發(fā)者不再需要協(xié)調(diào)其它服務(wù)部署對(duì)本服務(wù)的影響。微服務(wù)架構(gòu)模式使得持續(xù)化部署成為可能。所以使用微服務(wù)不是必須的,而是在適當(dāng)?shù)膶?shí)際,架構(gòu)適應(yīng)應(yīng)用場(chǎng)景的一種改變。 近段時(shí)間離職,跟同事們講解我之前所做的微服務(wù)相關(guān)產(chǎn)品,對(duì)于同事們提出的問(wèn)題,做了如下整理出來(lái),加上自己的理解,分享出來(lái)跟大家一起探討下: 問(wèn)題預(yù)覽 我為什么要換微服務(wù)?能...

    Seay 評(píng)論0 收藏0
  • 服務(wù)指南走北(一):服務(wù)是什么

    摘要:每個(gè)微服務(wù)提供一組,供其他微服務(wù)或者應(yīng)用客戶端所用。由于微服務(wù)架構(gòu)的分布式特點(diǎn),測(cè)試一個(gè)基于微服務(wù)架構(gòu)的應(yīng)用也是很復(fù)雜的任務(wù)。微服務(wù)架構(gòu)模式下,應(yīng)用的改變將會(huì)波及多個(gè)服務(wù)。 微服務(wù)Microservices已經(jīng)成為軟件架構(gòu)最流行的熱詞之一。網(wǎng)絡(luò)上看到很多關(guān)于微服務(wù)的文章,但是感覺(jué)很多離我們還很遙遠(yuǎn),并且沒(méi)有找到多少真正在企業(yè)場(chǎng)景中應(yīng)用的實(shí)例。此處省略一萬(wàn)字~~~~于是想要將自己最近一段...

    sherlock221 評(píng)論0 收藏0
  • 服務(wù)指南走北(二):服務(wù)架構(gòu)的進(jìn)程間通信(IPC)

    摘要:微服務(wù)常用的進(jìn)程間通信技術(shù)即表述性狀態(tài)傳遞英文,簡(jiǎn)稱是博士在年他的博士論文中提出來(lái)的一種軟件架構(gòu)風(fēng)格。摘自微服務(wù)實(shí)戰(zhàn)從架構(gòu)到部署處理部分請(qǐng)求失敗對(duì)于分布式的微服務(wù),必須要面對(duì)的一大問(wèn)題就是局部請(qǐng)求失敗的處理。 先拋出幾個(gè)問(wèn)題 微服務(wù)架構(gòu)的交互模式有哪些? 微服務(wù)常用的進(jìn)程間通信技術(shù)有哪些? 如何處理部分請(qǐng)求失敗? API的定義需要注意的事項(xiàng)有哪些 微服務(wù)的通信機(jī)制與SOA的通信機(jī)制之...

    beanlam 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<