亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

RESTful API URI 設計的一些總結

2019-11-17 02:11:06
字體:
來源:轉載
供稿:網友

RESTful API URI 設計的一些總結

非常贊的四篇文章:

  • Resource Naming
  • Best PRactices for Designing a Pragmatic RESTful API
  • 撰寫合格的 REST API
  • JSON 風格指南

本篇閱讀目錄:

  • 1. HTTP Methods
  • 2. JSON API 命名規則
  • 3. API URI design
  • 4. WebAPI 使用 snake_case 還是 camelCasing?

1. HTTP Methods

HTTP 常用方法:

  • GET: 獲取某個資源。
  • POST: 創建一個新的資源。
  • PUT: 替換某個已有的資源。
  • PATCH: 修改某個已有的資源。
  • DELETE:刪除某個資源。

我原先以為修改某一個資源,也是用 POST,后來發現還有一個 PATCH,但發現 HttpClient 并沒有提供此調用方法,需要我們進行擴展:

public static class HttpClientExtensions{   public static async Task<HttpResponseMessage> PatchAsync(this HttpClient client, Uri requestUri, HttpContent iContent)   {       var method = new HttpMethod("PATCH");       var request = new HttpRequestMessage(method, requestUri)       {           Content = iContent       };       HttpResponseMessage response = new HttpResponseMessage();       try       {           response = await client.SendAsync(request);       }       catch (TaskCanceledException e)       {           Debug.WriteLine("ERROR: " + e.ToString());       }       return response;   }}

調用代碼:

HttpContent httpContent = new StringContent("Your JSON-String", Encoding.UTF8, "application/json");var responseMessage = await httpClient.PatchAsync(new Uri("testUri"), httpContent);

2. JSON API 命名規則

相關閱讀:You should use camelCase with JSON, but snake_case is 20% easier to read

camelCase(駱駝命名)我們都非常熟悉,因為 C# 就是使用的這個命名法,snake_case(蛇形命名)適用于 python 和 ruby,比如商品 ID,camelCase 會命名為 productId,snake_case 則會命名為 product_id。

需要注意的是,snake_case 只限于 JSON API 命名,并不限于 URI,URI 中一般也不會使用下劃線,為什么要對 JSON API 進行規范命名?因為 RESTful 是無狀態風格,也就是說 RESTful API 并不限于某一種客戶端進行調用,所以 JSON API 的命名必須要規范,如果只是 C# 調用的話,那么命名采用 camelCase 命名就可以了,但顯然并不是這樣,最后得出的結論是使用 snake_case 命名會比較好,以后在設計的時候,需要注意了。

3. API URI design

API URI 設計最重要的一個原則:nouns (not verbs!),名詞(而不是動詞)。

CRUD 簡單 URI:

  • GET /users - 獲取用戶列表
  • GET /users/1 - 獲取 Id 為 1 的用戶
  • POST /users - 創建一個用戶
  • PUT /users/1 - 替換 Id 為 1 的用戶
  • PATCH /users/1 - 修改 Id 為 1 的用戶
  • DELETE /users/1 - 刪除 Id 為 1 的用戶

上面是對某一種資源進行操作的 URI,那如果是有關聯的資源,或者稱為級聯的資源,該如何設計 URI 呢?比如某一用戶下的產品:

  • GET /users/1/products - 獲取 Id 為 1 用戶下的產品列表
  • GET /users/1/products/2 - 獲取 Id 為 1 用戶下 Id 為 2 的產品
  • POST /users/1/products - 在 Id 為 1 用戶下,創建一個產品
  • PUT /users/1/products/2 - 在 Id 為 1 用戶下,替換 Id 為 2 的產品
  • PATCH /users/1/products.2 - 修改 Id 為 1 的用戶下 Id 為 2 的產品
  • DELETE /users/1/products/2 - 刪除 Id 為 1 的用戶下 Id 為 2 的產品

還有一種情況,我們一般在設計 API 的時候,會進行一些查詢操作,比如分頁和排序等,API 方法參數設計可能很容易,那重要的 URI 該如何設計呢?我們先看這樣的一個設計:

[HttpGet][Route("api/wzlinks/users-{spaceUserId}/{pageIndex=1}/{pageSize=20}")]public async Task<IEnumerable<WzLinkDTO>> GetPagedList(int spaceUserId, int pageIndex, int pageSize){.....}

首先,這個 URI 想要表示的意思是:獲取某一用戶下,分頁查詢的網摘列表,這個 API 設計好不好呢?我們看下 GitHub 中的一個 API:

"current_user_repositories_url": "https://api.github.com/user/repos{?type,page,per_page,sort}"

差別是不是很大?而且我們設計的 URI 表達也比較混亂,查詢應該是參數,并且是對 URI 進行的查詢,所以放在 URI 中會不太合適,我們完善下:

[HttpGet][Route("api/users/{space_user_id}/wzlinks")]public async Task<IEnumerable<WzLinkDTO>> GetPagedList(int space_user_id, int page, int per_page){.....}

URI 表達為:獲取 space_user_id 為 1 用戶下的網摘分頁列表,上面設計會不會更好些呢?調用示例:

api.VEVb.com/api/users/1/wzlinks?page=1&per_page=20

GitHub API(規范參考):https://api.github.com

{  "current_user_url": "https://api.github.com/user",  "current_user_authorizations_html_url": "https://github.com/settings/connections/applications{/client_id}",  "authorizations_url": "https://api.github.com/authorizations",  "code_search_url": "https://api.github.com/search/code?q={query}{&page,per_page,sort,order}",  "emails_url": "https://api.github.com/user/emails",  "emojis_url": "https://api.github.com/emojis",  "events_url": "https://api.github.com/events",  "feeds_url": "https://api.github.com/feeds",  "following_url": "https://api.github.com/user/following{/target}",  "gists_url": "https://api.github.com/gists{/gist_id}",  "hub_url": "https://api.github.com/hub",  "issue_search_url": "https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}",  "issues_url": "https://api.github.com/issues",  "keys_url": "https://api.github.com/user/keys",  "notifications_url": "https://api.github.com/notifications",  "organization_repositories_url": "https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}",  "organization_url": "https://api.github.com/orgs/{org}",  "public_gists_url": "https://api.github.com/gists/public",  "rate_limit_url": "https://api.github.com/rate_limit",  "repository_url": "https://api.github.com/repos/{owner}/{repo}",  "repository_search_url": "https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}",  "current_user_repositories_url": "https://api.github.com/user/repos{?type,page,per_page,sort}",  "starred_url": "https://api.github.com/user/starred{/owner}{/repo}",  "starred_gists_url": "https://api.github.com/gists/starred",  "team_url": "https://api.github.com/teams",  "user_url": "https://api.github.com/users/{user}",  "user_organizations_url": "https://api.github.com/user/orgs",  "user_repositories_url": "https://api.github.com/users/{user}/repos{?type,page,per_page,sort}",  "user_search_url": "https://api.github.com/search/users?q={query}{&page,per_page,sort,order}"}

4. WebAPI 使用 snake_case 還是 camelCasing?

補充:因為 space_user_id 違反 C# 的命名規則,Google 搜索“asp.net web api snake_case”,卻搜多到大量的“camelCasing”關鍵字,而且在微軟大部分 WebAPI 示例中,Route 的參數命名設計規范都是 camelCasing,所以。。。。沒辦法,只能使用 camelCasing 命名規則吧,誰讓用的是 .NET 呢,不過,有人還搞了個 SnakeCaseFormUrlEncodedMediaTypeFormatter 擴展,但好像是在過程中進行了轉化,并不是解決定義問題。

網摘的 API 我們再修改下:

[HttpGet][Route("api/users/{spaceUserId}/wzlinks")]public async Task<IEnumerable<WzLinkDTO>> GetPagedList(int spaceUserId, int page, int perPage){.....}

不經意間,還發現 ASP.NET WebAPI Help 一個有意思的地方,比如上面的 API 設計,得到的是這樣的 Help 說明:

如果我們把 API 代碼修改成:

[HttpGet][Route("api/users/{space_user_id}/wzlinks")]public async Task<IEnumerable<WzLinkDTO>> GetPagedList(int spaceUserId, int page, int perPage){.....}

得到的卻是這樣的 Help 說明:

發現有什么不同了嗎?看來 ASP.NET WebAPI Help 還是蠻智能的呢。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕av一区二区三区谷原希美| 久久久噜噜噜久久| 亚洲欧美综合区自拍另类| 亚洲精品国产免费| 日韩精品中文字| 成人国产在线激情| 欧美日韩在线一区| 51色欧美片视频在线观看| 国产精品视频一区二区高潮| 国产欧美一区二区白浆黑人| 91精品国产综合久久香蕉922| 红桃av永久久久| 国产精品露脸av在线| 欧美黄网免费在线观看| 国产精品三级美女白浆呻吟| 97精品一区二区视频在线观看| 日韩av在线免费| 久久福利网址导航| 久久久久久综合网天天| 91久久精品在线| 97精品国产91久久久久久| 一本色道久久88综合亚洲精品ⅰ| 清纯唯美亚洲激情| 777777777亚洲妇女| 亚洲精品久久久久久久久久久久| 国产精品视频一区二区三区四| 精品国产一区二区三区久久狼5月| 一本久久综合亚洲鲁鲁| 日韩在线中文字幕| 亚洲国产日韩欧美在线99| 日韩av电影手机在线| 国产精品丝袜久久久久久不卡| 久久在线精品视频| 欧美怡红院视频一区二区三区| 日韩国产高清污视频在线观看| 日韩欧美高清视频| 日韩精品免费在线| 国产精品极品尤物在线观看| 精品亚洲精品福利线在观看| 亚洲香蕉在线观看| 国产成人精品免高潮费视频| 一本色道久久88亚洲综合88| 亚洲欧美日韩国产成人| 久久综合网hezyo| 成人中文字幕在线观看| 亚洲精品综合久久中文字幕| 亚洲午夜久久久影院| 亚洲美女精品成人在线视频| 国产欧美日韩免费看aⅴ视频| 日韩在线观看电影| 欧美日韩视频免费播放| 精品久久久久久久久久久久久| 一区二区三区天堂av| 久久免费视频观看| 色琪琪综合男人的天堂aⅴ视频| 国产日韩在线看片| 日韩在线小视频| 精品在线欧美视频| 91日本在线观看| 在线观看久久av| 国产激情久久久| 91精品在线国产| 精品美女永久免费视频| 伊人激情综合网| 久久精品视频在线播放| 92福利视频午夜1000合集在线观看| 日韩有码在线视频| 成人国产精品色哟哟| 亚洲成人网久久久| 国产亚洲精品高潮| 6080yy精品一区二区三区| 91理论片午午论夜理片久久| 日韩av在线免费播放| 国产欧美精品在线播放| 精品久久久久久久久中文字幕| 精品自拍视频在线观看| 精品国产欧美一区二区五十路| 在线观看免费高清视频97| 欧美一区二区三区免费观看| 911国产网站尤物在线观看| 欧美精品久久久久久久免费观看| 日韩中文字在线| 欧美日韩第一视频| 欧美激情第1页| 欧美丰满少妇xxxx| 91香蕉嫩草神马影院在线观看| 国产精品美女久久久久久免费| 亚洲精品中文字幕有码专区| 亚洲性xxxx| 国产精品一二区| 欧美成人激情视频免费观看| 97超碰蝌蚪网人人做人人爽| 亚洲欧美制服综合另类| 午夜精品在线视频| 久久这里有精品视频| 亚洲男人天堂网站| 欧美黄色www| 国产精品第1页| 国内精品久久久久久久| 国产成人av在线播放| 色偷偷av一区二区三区| 日韩在线视频网站| 亚洲国产精品99| 91免费精品国偷自产在线| 中文字幕av一区二区| 亚洲国产精品久久精品怡红院| 少妇高潮 亚洲精品| 亚洲日韩欧美视频一区| 午夜精品福利电影| 欧美日产国产成人免费图片| 久久久久久12| 久久99国产综合精品女同| 国产综合香蕉五月婷在线| 日韩电影免费在线观看中文字幕| 中文字幕精品在线| 欧美激情xxxxx| 亚洲综合在线小说| 国产精品极品尤物在线观看| 亚洲欧美一区二区三区四区| 久久99精品久久久久久琪琪| 18一19gay欧美视频网站| 韩国三级日本三级少妇99| 这里只有精品丝袜| 日韩欧美亚洲综合| 国产精品视频资源| 中日韩午夜理伦电影免费| 亚洲精品视频在线观看视频| 91在线免费看网站| 韩日欧美一区二区| 成人国产精品免费视频| 成人黄色免费在线观看| 91精品国产高清| 日韩美女激情视频| 亚洲在线视频福利| 国产亚洲精品一区二区| 久久亚洲精品国产亚洲老地址| 亚洲综合一区二区不卡| 欧美性高潮在线| 欧美性开放视频| 欧洲永久精品大片ww免费漫画| 亚洲mm色国产网站| 国产精品成人在线| 国产亚洲美女久久| 亚洲高清一二三区| 青青草99啪国产免费| 国产99久久久欧美黑人| 国产精品尤物福利片在线观看| 高清在线视频日韩欧美| 欧美激情精品久久久| 亚洲大胆人体av| 日韩成人在线网站| 国产精品视频区| 国产精品免费久久久| 日产日韩在线亚洲欧美| 亚洲精品免费在线视频| 日本国产高清不卡| 久久久久久九九九| 一本色道久久综合狠狠躁篇怎么玩| 精品电影在线观看| 久久不射热爱视频精品| 日韩高清电影免费观看完整版| 热久久99这里有精品| 日韩欧美中文第一页| 欧美自拍视频在线观看|