基于.NetCore開發博客項目 StarBlog - (21) 開始開發RESTFul接口

1前言

最近電腦壞了,開源項目的進度也受到一些影響

這篇醞釀很久了,作為本系列第二部分(API接口開發)的第一篇,得想一個好的開頭,想著想著就鴿了好久,索性不扯那么多了,直接開寫吧~

2關于RESTFul

網上很多相關的文章都要把RESTFul歷史來龍去脈給復制一遍,所以我這就不重復了,現在主要的HTTP接口風格就倆:RPC和RESTFul。

舉個例子就可以看出這倆的區別

RPC風格

分別是增刪改查的接口

操作HTTP方法URL
post/blog/add
post/blog/deleteById
post/blog/updateById
get/blog/getAll

可以看出RPC風格的特點:

  • 基本就是用post和get這倆方法來操作接口

  • URL的命名跟函數命名一樣,都是動詞,一目了然

PS:RPC這種幾乎一個團隊一個風格,我見過有人把所有接口都做成post方法,然后請求參數全部用json格式放在body里的。

關鍵是這個請求參數還不統一,同個項目不同開發人員寫的請求參數格式不一致,很惡心。(微信有些接口也是這樣)

RESTFul風格

分別是增刪改查的接口

操作HTTP方法URL
post/blog/
delete/blog/{id}/
put/blog/{id}/
get/blog/
get/blog/{id}/

可以看出RESTFul風格的特點:

  • 利用各種HTTP方法來實現增刪改查(其實還有patch、head這些方法,不展開了)

  • URL的命名是名詞,以資源名稱作為URL,更統一

  • 使用get獲取資源,方便后端、客戶端、網關這些地方做緩存,提高性能

接口返回值

除了請求接口,RESTFul還建議接口返回的時候根據不同狀態使用不同的HTTP狀態碼。

以下是HTTP定義的五類狀態碼。

類別描述
1xx:信息通信傳輸協議級信息。
2xx:成功表示客戶端的請求已成功接受。
3xx:重定向表示客戶端必須執行一些其他操作才能完成其請求。
4xx:客戶端錯誤此類錯誤狀態代碼指向客戶端。
5xx:服務器錯誤服務器負責這些錯誤狀態代碼。
  • 比如添加了數據,返回 201 (created)

  • 添加、更新、刪除這些不需要返回數據的接口,返回 204 (no content)

  • 沒登錄,返回 401 (unauthorized)

  • 找不到,返回 404 (not found)

  • 沒權限,返回 403 (forbidden)

這樣就很清晰了,看接口返回的狀態碼就能知道結果如何。

在一些前端ajax庫(比如axios)中,返回碼如果是4xx或5xx,就會拋出異常,這樣訪問邏輯就可以根據錯誤做出一些提示。

例子

假設接口返回結構是這樣

{"successful":?true,"message":?"請求成功","data":?[{...},?{...},?{...}]
}

請求接口的 JavaScript 代碼如下

axios.get('/blog/').then(res?=>?msg.success(`請求成功,返回信息:${res.data.message}`)).catch(res?=>?msg.error(`請求失敗,返回信息:${res.data.message}`))

但是!實際場景很復雜,HTTP標準狀態碼就40個,根本不夠用啊。

所以這些HTTP狀態碼只能對返回值做個大概的分類,復雜系統還是得自己定義一套錯誤碼。

小結

這倆各有優劣,RESTFul看起來比較統一優雅,但表達能力有限;RPC的URL命名看起來比較隨意,不過自由發揮的空間也很大。

我個人是比較傾向RESTFul風格的,所以StarBlog使用了RESTFul風格的接口,不過這并不能滿足全部功能需求,所以參考Django的RestFramework,將RESTFul和RPC稍微結合一下。

舉個例子:要在博客增刪改查的基礎上增加設置置頂、點贊等功能。

操作HTTP方法URL
設置置頂post/blog/{id}/setTop/
點贊post/blog/{id}/thumbUp/
獲取置頂文章get/blog/getTop/

可以看到這種縫合怪是以RESTFul為基礎,增刪改查以外的功能,在對應的資源上使用RPC風格。

setTop / thumbUp / getTop 這些動詞在RestFramework里面也叫 action ,意為對一系列資源執行的動作。

關于HTTP方法,對資源有修改的,使用post方法,沒有修改單純讀取的,使用get方法。

3接口開發規劃

本系列文章更新順序跟StarBlog博客開發的順序基本一致,即在已有MVC架構網站的基礎上,增加RESTFul接口,用于管理后臺(前后端分離)對博客進行配置管理。

目前我把接口分成這幾類

  • auth - 認證授權,顧名思義,后面會細說

  • admin - 管理員相關,主要功能有配置管理、訪問記錄、系統監控等

  • blog - 博客相關,功能就是文章、分類、圖片等信息的crud

  • common - 公用接口,StarBlog除了博客功能外,還以接口形式提供了一些小功能,如一句詩、一言、隨機圖片、主題切換等

  • test - 測試接口,用于一些功能測試,在正式環境會關閉訪問

  • links - 友情鏈接管理,這個功能比較復雜,單獨做成一個分類

后續會有更多類似友情鏈接這樣比較復雜的功能加入(比如評論),這種會單獨做成一個分類。

PS:之前在開發博客前臺的時候,把大部分功能都寫在了 services 里面,現在開發接口的時候就派上用場了,很多邏輯都是通用的,在接口的controller里面只需要調用這些 services 就可以了。

4需要關注的其他東西

本文不涉及具體實現,只是作為RESTFul接口開發部分的前言或者大綱,接口開發看似就crud四個操作很簡單,實際上比想象的復雜。

例如,獲取文章列表接口,博客的文章數量會很多,不可能一個接口返回所有文章信息,因此要做分頁處理,同時我們還希望能在文章列表實現關鍵詞過濾、分類、狀態篩選、排序等功能;

已登錄用戶才能發表評論,管理員才能管理文章,因此需要實現認證授權、角色管理等功能;

同一時間可能有很多人訪問博客(或者是爬蟲),需要對接口做限流處理,以免程序崩潰;

接口數量多起來了,swagger顯示太雜亂,需要對接口分組,或者更換swagger前端;

正式環境不想讓用戶看到swagger接口文檔,可以隱藏或者給swagger加鎖;

頻繁訪問的資源,可以使用服務端緩存提升性能,減輕IO壓力,使用客戶端緩存降低服務器流量;

耗時操作(如批量導出文章、發送短信通知)放到異步任務隊列(或者后臺任務)里執行;

以上列舉的種種只是我在撰寫本文的當下考慮博客需要用到的,實際上應該還有很多。只能說后端的水很深,開發本項目的過程也是一個不斷探索、實踐的過程,“No silver bullet”,沒有任何技術能適用全部場景,只能在不斷的積累中得出某個場景下的最佳實踐。

OK,本文就到這吧。

5系列文章

  • 基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客?

  • 基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目

  • 基于.NetCore開發博客項目 StarBlog - (3) 模型設計

  • 基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入

  • 基于.NetCore開發博客項目 StarBlog - (5) 開始搭建Web項目

  • 基于.NetCore開發博客項目 StarBlog - (6) 頁面開發之博客文章列表

  • 基于.NetCore開發博客項目 StarBlog - (7) 頁面開發之文章詳情頁面

  • 基于.NetCore開發博客項目 StarBlog - (8) 分類層級結構展示

  • 基于.NetCore開發博客項目 StarBlog - (9) 圖片批量導入

  • 基于.NetCore開發博客項目 StarBlog - (10) 圖片瀑布流

  • 基于.NetCore開發博客項目 StarBlog - (11) 實現訪問統計

  • 基于.NetCore開發博客項目 StarBlog - (12) Razor頁面動態編譯

  • 基于.NetCore開發博客項目 StarBlog - (13) 加入友情鏈接功能

  • 基于.NetCore開發博客項目 StarBlog - (14) 實現主題切換功能

  • 基于.NetCore開發博客項目 StarBlog - (15) 生成隨機尺寸圖片

  • 基于.NetCore開發博客項目 StarBlog - (16) 一些新功能 (監控/統計/配置/初始化)

  • 基于.NetCore開發博客項目 StarBlog - (17) 自動下載文章里的外部圖片

  • 基于.NetCore開發博客項目 StarBlog - (18) 實現本地Typora文章打包上傳

  • 基于.NetCore開發博客項目 StarBlog - (19) Markdown渲染方案探索

  • 基于.NetCore開發博客項目 StarBlog - (20) 圖片顯示優化

  • 基于.NetCore開發博客項目 StarBlog - (21) 開始開發RESTFul接口

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

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

相關文章

03 Oracle分區表

Oracle分區表 先說句題外話… 歡迎成都天府軟件園的小伙伴來面基交流經驗~ 一:什么是分區(Partition)? 分區是將一個表或索引物理地分解為多個更小、更可管理的部分。 分區對應用透明,即對訪問數據庫的應用而言&…

windows獲取本地時間_如何在Windows 8中重新獲得本地登錄

windows獲取本地時間By default a fresh Windows 8 installation prompts you to create a synchronized cloud-enabled login. While there are distinct perks to Microsoft’s live login system, sometimes you just want to keep things simple and local. Read on as we …

如何解決高并發,秒殺問題

相信不少人會被這個問題困擾,分享大家一篇這樣的文章,希望能夠幫到你! 一、秒殺業務為什么難做?1)im系統,例如qq或者微博,每個人都讀自己的數據(好友列表、群列表、個人信息&#xf…

Spring原理之代理與動態代理模式總結(四)

2019獨角獸企業重金招聘Python工程師標準>>> 代理模式 1,什么是代理模式? 代理模式的作用是:為其他對象提供一種代理以控制對這個對象的訪問。2,代理模式有什么好處? 在某些情況下,一個客戶不…

可執行文件添加快捷方式_如何停止Windows向快捷方式文件名添加“-快捷方式”...

可執行文件添加快捷方式When you make a new shortcut in Windows, it automatically adds “- Shortcut” to the end of the shortcut’s file name. This doesn’t seem like a big deal, but they can be bothersome. Sure, you can remove the text yourself when you cre…

Red hat6.4重新安裝yum

今天在Red Hat上安裝軟件時,發現需要依賴軟件,然而在用yum指令時,出現了下面的錯誤: This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. 出現這個問題的原因是&…

使用 BenchmarkDotNet 比較指定容量的 List 的性能

我們之前提到 List 是 .NET 中常用的數據結構,其在存儲大量數據時,如果能夠指定它的初始化容量,就會有性能提升。這個優化的方法并不是很明顯,因此本文將使用 BenchmarkDotNet 庫,通過定量對比的方式來證明這一點。實驗…

看明星合影爭C位,學PPT中C位排版法

在娛樂圈里,C位是大咖位,是對藝人實力的最好證明,藝人們自然會想著去力爭C位,正所謂“不想當將軍的兵不是好兵,不想站C位的明星不是好明星”。那么,C位是什么意思?C位,網絡流行語&am…

javafx由淺到深的 認識(一)

javafx是一款比較新興的語言框架,隨著javafx越來越實用,估計許多程序員也會慢慢接觸它,故我在這里對它由淺到深進行介紹一下. 首先,要了解javafx,就應該先知道.xml文件的布局軟件,以往java都是通過敲代碼來進行布局的,但javafx有力新的突破,它實現了拖動方式,目前我使用的輔助軟…

linux用戶的根目錄_為什么Linux允許用戶刪除根目錄?

linux用戶的根目錄Most of the time, none of us willingly performs an action that will literally break our operating systems and force us to reinstall them. But what if such an action could easily occur even by accident on the user’s part? Today’s SuperUs…

純css實現叉號

HMTL部分 <a href"#" class"close"></a> CSS部分 .close {position: absolute;right: 32px;top: 32px;width: 32px;height: 32px; } .close:before, .close:after {position: absolute;left: 15px;content: ;height: 33px;width: 2px;backgro…

微軟跨平臺maui開發chatgpt客戶端

image什么是maui.NET 多平臺應用 UI (.NET MAUI) 是一個跨平臺框架&#xff0c;用于使用 C# 和 XAML 創建本機移動(ios,andriod)和桌面(windows,mac)應用。imagechagpt最近這玩意很火&#xff0c;由于網頁版本限制了ip&#xff0c;還得必須開代理&#xff0c; 用起來比較麻煩&a…

在Xshell 6開NumLock時按小鍵盤上的數字鍵并不能輸入數字

小鍵盤問題 在Xshell 6上用vi的時候&#xff0c;開NumLock時按小鍵盤上的數字鍵并不能輸入數字&#xff0c;而是出現一個字母然后換行&#xff08;實際上是命令模式上對應上下左右的鍵&#xff09;。解決方法 選項Terminal->Features里&#xff0c;找到Disable application …

WebP 在減少圖片體積和流量上的效果如何?—— WebP 技術實踐分享

作者 | Jackson編輯 | 尾尾 不論是 PC 還是移動端&#xff0c;圖片一直占據著頁面流量的大頭&#xff0c;在圖片的大小和質量之間如何權衡&#xff0c;成為了長期困擾開發者們的問題。而 WebP 技術的出現&#xff0c;為解決該問題提供了好的方案。本文將為大家詳細介紹 WebP 技…

chrome 固定縮放比例_您如何調整Google Chrome瀏覽器的用戶界面縮放比例?

chrome 固定縮放比例Everything can be going along nicely until a program gets a new update that suddenly turns everything into a visual mess, like scaling up the UI, for example. Is there a simple solution? Today’s SuperUser Q&A post has some helpful …

樹莓派 Raspberry Pi 更換國內源

http://www.shumeipaiba.com/wanpai/jiaocheng/16.html轉載于:https://www.cnblogs.com/Baronboy/p/9185849.html

優雅告別 2022 年,2023 年主題:敢想,就敢做!

自從工作之后&#xff0c;每年春節我都會花一天時間&#xff0c;一個人待在一個小房間&#xff0c;思考自己今年做了什么具備階段性成果的事情。然后&#xff0c;寫下明年需要執行的計劃。會寫在一個 XMind 文件里&#xff0c;記錄每一年將要執行的計劃&#xff0c;且未完成的計…

純js上傳文件 很好用

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>參數設置</title> <meta name"keywords&q…

買臺電腦,不行!去旅游一下,不行!論程序員怎么實現財務自由!

“最近讀了一本不是編程的程序員技能書《軟技能-代碼之外的生存指南》&#xff0c;全書分為 7 個篇章&#xff0c;分別是職業、自我營銷、學習、生產力、理財、健身和精神。在讀完職業、自我營銷和理財這三個篇章后&#xff0c;讓我感觸很深&#xff0c;也讓我很意外。本來以為…

java發送gmail_如何在Gmail中輕松通過電子郵件發送人群

java發送gmailMailing lists are an old tool in the email arsenal, but their implementation in Gmail isn’t immediately intuitive. Read on as we show you how to email groups using your Gmail account. 郵件列表是電子郵件庫中的一個舊工具&#xff0c;但是在Gmail中…