RESTFUL如何指導WEB API設計?

来源:https://www.cnblogs.com/time-read/archive/2019/05/20/10895794.html
-Advertisement-
Play Games

博主剛剛接觸web開發的時候,寫了一個介面 /get_article_info/1 獲取id為1的這篇文章的內容,被前輩們看見了,前輩給我說我這個介面設計的不太好啊,不符合RESTFUL規範,當前輩們說出這些話的時候,我很迷惑,我寫的介面不能夠好好工作嗎?能夠正常返回內容啊,對於不存在的文章也能夠在 ...


  博主剛剛接觸web開發的時候,寫了一個介面 /get_article_info/1 獲取id為1的這篇文章的內容,被前輩們看見了,前輩給我說我這個介面設計的不太好啊,不符合RESTFUL規範,當前輩們說出這些話的時候,我很迷惑,我寫的介面不能夠好好工作嗎?能夠正常返回內容啊,對於不存在的文章也能夠在返回的內容體中提示不存在,而且介面的意思很明確,一看就能明白,這還有什麼不好的地方嗎?

一、RESTFUL是什麼?

  RESTFUL是英文單詞Representational State Transfer的縮寫,翻譯成中文就是表現層狀態轉化,什麼是表現層?什麼是狀態?什麼是轉化?

  表現層可以理解為一種資源,可以是一篇文章,一張圖片,一個訂單...... 所有網路上的一個實體,都可以說是一個資源,而URL就是這個唯一資源的定位符,狀態和轉化應該連在一起理解,這是一個動作,即狀態變化,可以是新建,刪除,更新,獲取,比如新建一篇文章,刪除一篇文章,更新文章內容,獲取文章內容。HTTP協議應當如何表示這種變化?HTTP協議中有四個操作方法,可以用來表示,GET表示獲取,POST表示新建,DELETE表示刪除,PUT表示更新。

  綜上,RESTFUL可以通俗的理解通過HTTP協議的動詞和URL對一個資源進行各種操作,實現表現層狀態轉化。

二、 RESTFUL如何指導我們設計API?

核心思想就是HTTP動詞 + URL資源,比如獲取文章信息 GET /articles, GET是動詞,/articles 是名詞

1. 動詞通常是HTTP的方法

GET:    獲取信息
POST:   新建信息
DELETE: 刪除信息
PUT:    更新信息

2. 資源必須是名詞

已經有了HTTP的方法的動詞,URL中,我們就沒有必要使用動詞了

POST /create_articles   
POST /delete_articles   
POST /update_articles   

上面都是不好的用法,我們應當使用下麵這種用法

POST    /articles
DELETE  /articles/2
PUT     /articles/2

3. 資源最好使用名詞的複數,任何情況下都能夠適用

/airticles/1  獲取id為1的文章內容
/airticles    獲取所有文章內容
# 使用單數
/article 獲取一篇文章內容?還是所有的文章內容?

4. 避免多級URL

/authors/5/airticles  獲取作者id為5的所有文章
上面換成這種形式更好,也利於擴展
/airticles?author_id=5

5. 利用querystring來過濾和篩選

一般情況下一個url很難滿足複雜多變的情況,比如分頁,過濾,這時候我們應當如何設計?

/airticles/published  這種形式?

不不不,published不是一個資源,而且這種url不宜於擴展

最佳實踐應當是下麵這種形式

/articles?page=1          獲取第一頁的文章
/articles?published=true  獲取已經發佈的文章

6. 返回有意義的狀態碼

HTTP有很多狀態碼,表示不同的意義,我們應當充分利用這些狀態碼

尤其是出現錯誤時,不要返回200,意義很不明確

一般成功請求後返回的狀態碼

GET:200 OK
POST:201 Created
PUT:200 OK
DELETE:204 No Content

其他狀態碼信息

1xx:相關信息

2xx:請求成功

3xx:重定向

4xx:客戶端錯誤

5xx:伺服器端錯誤

2xx狀態碼表示成功

200 OK 請求成功

201 Created 請求成功,並創建了資源

202 Accepted 請求接受,但未處理完成,一般用於非同步處理

204 No Content 請求處理成功,但未返回內容,一般用於DELETE請求成功

3xx狀態碼表示重定向

301 Moved Permanently 永久重定向

302 Found 暫時重定向

4xx狀態碼表示客戶端錯誤

400 Bad Request 錯誤請求,伺服器不理解請求,沒做任何處理

401 Unauthorized 未認證

403 Forbidden 用戶通過了認證,但是沒有許可權

404 Not Found 沒有發現請求的內容

405 Method Not Allowed 不允許的請求方法

5xx狀態碼表示服務端錯誤

500 Internal Server Error 伺服器內部錯誤,無法完成請求

503 Service Unavailable 服務不可用

三、總結

  RESTFUL就是一種規範,我們不遵循這種規範也能夠寫出可用的代碼,但是遵循這種規範卻能給我們帶來更多的好處,API設計更加可讀,與其他人交流也能夠很方便。現在讓我看看我剛剛接觸web介面開發時的設計,真的是不太好啊,URL信息太重覆,錯誤的返回狀態不明確,全是200。

參考文章:https://blog.florimond.dev/restful-api-design-13-best-practices-to-make-your-users-happy

rear


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 要實現這個功能其實並不難,element組件直接用就可以, 但是我在使用過程中碰到了幾個坑,就記錄下來,分享給大家,避免落坑,話不多說,直接上過程...... 表單校驗功能: 實現這個功能,總共分為以下4布: template代碼: data定義數據代碼: methods方法代碼: 註意點:①定義p ...
  • 概述 目前css佈局方案中,網格佈局可以算得上是最強大的佈局方案了。它可以將網頁分為一個個網格,然後利用這些網格組合做出各種各樣的佈局。 基本概念 在學習grid佈局之前,我們需要瞭解一些基本概念 1.容器和項目 採用網格佈局的區域,稱為“容器”。容器內部的採用網格定位的子元素稱為“項目” 上面的代 ...
  • 前面 我們每天都在瀏覽著網路上豐富多彩的頁面,那麼在網頁中所呈現出的絢麗多彩的內容是怎麼設計出來的呢?我們想要自己設計一個頁面又該如何來做呢?對於剛剛接觸網頁設計的小伙伴來說,看到網頁背後的一堆符號和代碼,是不是會感到有些凌亂。“看這裡、看這裡”,其實HTML並不複雜,嚴格意義上它並不是編程,它只是 ...
  • 何為質數: 只能被1 和 自身 整除的數; 方法: 利用js中求模, 看是否有餘數. > 3%2 = 1; 5%2 = 3......... 代碼如下: 以上方法是為判斷一個數是否為質數; 那如何判斷1到任意數之間的所有質數呢, 就比較簡單; 代碼如下: 到此完結. 核心test方法, 遍歷時, 碰 ...
  • 問題描述: 前些天在練習寫一個小例子的時候用到了定時器,發現在setInterval和setTimeout中傳入函數時,函數中的this會指向window對象,如下例: var num = 0;function Obj (){ this.num = 1, this.getNum = function ...
  • 上一篇理解Express的使用之後, 再總結一篇Express中間件的簡單實現原理。 我們知道Express中間件就是一個個的函數, 那麼怎麼讓這些函數有序的執行呢? 那就需要我們調用 函數。其實 函數調用的就是下一個中間件函數。 以下代碼實現了簡單的 註冊中間件, 以及 、`post`方式的中間件 ...
  • Map 對象保存鍵值對。任何值(對象或者原始值) 都可以作為一個鍵或一個值。構造函數 可以接受一個數組作為參數。 Map和Object的區別 一個 的鍵只能是字元串或者 ,但一個 的鍵可以是任意值。 中的鍵值是有序的(FIFO 原則),而添加到對象中的鍵則不是。 的鍵值對個數可以從 size 屬性獲 ...
  • 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本、處理類、service等完整模塊2.多數據源:(支持同時連接無數個資料庫,可以不同的模塊連接不同數的據庫)支持N個數據源3.阿裡資料庫連 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...