RESTful API淺談

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

上半年時候,部門有組織的討論了一下實踐微服務的技術話題,主要內容是SOA服務和微服務各自的優勢和難點,其中有提到關于RESTful API設計方法。

正好最近在深入的學習HTTP協議,也看了一些有關RESTful API的資料,這篇博客,就將自己的一些理解整理記錄一下。

PS:本篇博客主要談一些概要的設計思想和方法,不談具體的實現細節,如有誤差歡迎指出,謝謝!

想進一步了解RESTful API,建議學習下面列出的一些詞條:

HTTP協議、分布式系統架構原理(CAP)、操作系統原理。。。

參考資料:

跟著Github學習TESTful HTTP API設計

一種RESTful API接口的約定

RESTful API設計最佳實踐

知乎:如何用通俗易懂的語言解釋RESTful API?

?

一、REST的由來

全稱:REST,全稱是Resource Representational State Transfer,即:資源在網絡中以某種形式進行狀態轉移。————所謂狀態的轉移,可參考《HTTP權威指南》一書中對協議的詳細解釋,此處不過多贅述!

出現:REST最早是由Roy Fielding博士發表的論文中提到的,他也曾參與設計了HTTP協議。論文地址:http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

定義:簡單來說REST是一種系統架構設計風格(而非標準),一種分布式系統的應用層解決方案。

背景:早期的網頁端是前后臺一起的,比如PHP、JSP等。而隨著近幾年移動端的快速發展和分布式架構的應用,各種Client層出不窮,這個時候就需要有個統一的機制,來為前后端通信提供服務。

? ? ?而RESTful API就是目前比較成熟的的一套應用程序API設計理論。

目的:Client和Server端進一步解耦。

應用:最為經典的莫過于github API。

?

二、RESTful的特征和優點

1、客戶端-服務器(Client-Server):提供服務的服務器和使用服務的客戶端分離解耦;

? ?優點:提高客戶端的便捷性(操作簡單)

? ? ? ? 簡化服務器提高可伸縮性(高性能、低成本)

? ? ? ? 允許客戶端服務端分組優化,彼此不受影響

2、無狀態(Stateless):來自客戶的每一個請求必須包含服務器處理該請求所需的所有信息(請求信息唯一性);

? ?優點:提高可見性(可以單獨考慮每個請求)

? ? ? ? 提高可靠性(更容易故障恢復)

? ? ? ? 提高了可擴展性(降低了服務器資源使用)

3、可緩存(Cachable):服務器必須讓客戶端知道請求是否可以被緩存?如果可以,客戶端可以重用之前的請求信息發送請求;

? ?優點:減少交互連接數

? ? ? ? 減少連接過程的網絡時延

4、分層系統(Layered System):允許服務器和客戶端之間的中間層(代理,網關等)代替服務器對客戶端的請求進行回應,而客戶端不需要關心與它交互的組件之外的事情;

? ?優點:提高了系統的可擴展性

? ? ? ? 簡化了系統的復雜性

5、統一接口(Uniform Interface):客戶和服務器之間通信的方法必須是統一化的。(例如:GET,POST,PUT.DELETE)

? ?優點:提高交互的可見性

? ? ? ? 鼓勵單獨優化改善組件

6、支持按需代碼(Code-On-Demand,可選):服務器可以提供一些代碼或者腳本并在客戶的運行環境中執行。

? ?優點:提高可擴展性

?

三、概要設計方法

1、協議

API與Client的通信協議,總是使用HTTPS協議。

PS:使用HTTPS協議和RESTful API本身沒有多大關系,但是對于增加網站的安全是非常重要的,特別是如果提供的是公開的API,那么HTTPS久更顯得重要了。

2、域名

應該盡量將API部署在專用的域名下面,比如:

?https://api.github.com?

如果API變化較大,可以把API設計為子域名,比如:

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

3、版本(Versioning)

一般而言應該將API放入URL中,比如:

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

還可以將版本號放入HTTP信息頭中,但這樣不如放入URL方便和直觀。

4、路徑(Endpoint)

在協議中,每個網址代表一種資源的存放地址,所以網址終不能有動詞,只能有名詞,而且名詞一般都應該與數據庫的表字段對應,且API中的名詞應該使用復數。例如:

/users/:username/repos
/users/:org/repos
/repos/:owner/:repo
/repos/:owner/:repo/tags
/repos/:owner/:repo/branches/:branch

PS:根據RFC3986定義,URL是大小寫敏感的,所以應該盡量使用小寫字母來命名!

5、方法(Method)

有了資源的URL設計,所有針對資源的操作都是使用HTTP方法指定的,常見的方法有(括號中為對應的SQL命令):

Verd描述
HEAD(SELECT)只獲取某個資源的頭部信息
GET(SELECT)獲取資源
POST(CREATE)創建資源
PATCH(UPDATE)更新資源的部分屬性(很少用,一般用POST代替)
PUT(UPDATE)更新資源,客戶端需要提供新建資源的所有屬性
DELETE(DELETE)刪除資源

比如:

GET /user:列出所有的用戶POST /user:新建一個用戶PATCH /user/ID:更新某個指定用戶的信息DELETE /user/ID:刪除所有用戶

6、數據過濾(Filtering)

如果數據量太大,服務器不可能將所有數據返回給用戶。API應該提供參數(比如Query),過濾返回結果。比如:

?limit=10:指定返回記錄的數量
?offset=10:指定返回記錄的開始位置
?page=2&per_page=100:指定第幾頁,以及每頁的記錄數
?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序
?state=close:指定篩選條件

7、狀態碼

在HTTP報文構成中,有個字段很重要:status code。它說明請求的大致情況,是否正常處理、出現了什么錯誤等。狀態碼都是三位數,大概分為了一下幾個區間:

狀態碼描述
2XX請求正常處理并返回
3XX重定向,請求的資源位置發生變化
4XX客戶端發送的請求有誤
5XX服務器端的錯誤

關于狀態碼,具體的介紹可以去我之前的博客HTTP狀態碼或者參考其他資料,這里不過多贅述。

8、錯誤處理

如果出錯的話,在response body中應通過message字段,以鍵值對的格式,給出明確的錯誤信息。

最基本的思路應該是:盡可能提供準確的錯誤信息,比如數據格式不正確、缺少某個字段......而不是直接說“請求錯誤”之類的信息。

9、Hypermedia API

Restful API的設計最好做到Hypermedia:即在返回結果中提供相關資源的鏈接,連向其他API方法,使用戶不需要查文檔也知道下一步做什么。

這樣做的好處是,用戶可以根據返回結果就能得到后續操作需要訪問的地址。

10、身份驗證

一般來說,讓任何人隨意訪問公開的 API 是不好的做法,驗證和授權是兩件事情:

驗證(Authentication):確定用戶是其申明的身份,比如提供賬戶的密碼。不然的話,任何人偽造成其他身份(比如其他用戶或者管理員)是非常危險的;

授權(Authorization):保證用戶有對請求資源特定操作的權限。比如用戶的私人信息只能自己能訪問,其他人無法看到;有些特殊的操作只能管理員可以操作,其他用戶有只讀的權限等。

如果沒有通過驗證,需要返回401 Unauthorized狀態碼,并在 body 中說明具體的錯誤信息;而沒有被授權訪問的資源操作,需要返回403 Forbidden狀態碼,還有詳細的錯誤信息。

PS:Github API 對某些用戶未被授權訪問的資源操作返回404 Not Found,目的是為了防止私有資源的泄露(比如黑客可以自動化試探用戶的私有資源,返回 403 的話,就等于告訴黑客用戶有這些私有的資源)。

11、編寫文檔

API最終是給人使用的,無論是對內還是對外,即使遵循上面提到的所有規則,API設計的很優雅,但有時候用戶還是不知道該如何使用這些提供的API。

因此,編寫清晰可讀的文檔是很必要的事情。

而且編寫文檔也可以作為產出物的一部分,以及用來做記錄,以方便查詢參考。

?

以上內容為我個人整理記錄的關于RESTful API的概要內容,感興趣的童鞋可以自行查閱其他資料,本博客不保證內容的完全正確性!

轉載于:https://my.oschina.net/u/3787897/blog/1631290

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

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

相關文章

spring自動注入--------

<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:p"http://www.springframework.org/schema/p"xmlns:c"http://www.springframework.org/schema/c"xmlns…

變量的作用域和生存期:_生存分析簡介:

變量的作用域和生存期:In the previous article, I have described the Kaplan-Meier estimator. To give a quick recap, it is a non-parametric method to approximating the true survival function. This time, I will focus on another approach to visualizing a surviv…

數字孿生營銷_如何通過數字營銷增加您的自由職業收入

數字孿生營銷There are a lot of ways we could go with this topic as it’s a huge one, but I just want to cover the nuggets here and make it simple as well as practical to understand and implement.我們可以采用很多方法來處理這個主題&#xff0c;因為它是一個很大…

您的網卡配置暫不支持1000M寬帶說明

國內寬帶網速越來越快&#xff0c;運營商更是在今年初紛紛推進千兆寬帶業務。為了讓用戶更好地了解網絡狀況&#xff0c;360寬帶測速器發布新版&#xff0c;優化了寬帶測速范圍&#xff0c;可有效支持最高1000&#xff2d;的帶寬測量。此外&#xff0c;寬帶測速器能檢測用戶網卡…

教輔的組成(網絡流果題 洛谷P1231)

題目描述 蒟蒻HansBug在一本語文書里面發現了一本答案&#xff0c;然而他卻明明記得這書應該還包含一份練習題。然而出現在他眼前的書多得數不勝數&#xff0c;其中有書&#xff0c;有答案&#xff0c;有練習冊。已知一個完整的書冊均應該包含且僅包含一本書、一本練習冊和一份…

Java中怎么樣檢查一個字符串是不是數字呢

問題&#xff1a;Java中怎么樣檢查一個字符串是不是數字呢 在解析之前&#xff0c;怎么樣檢查一個字符串是不是數字呢 回答一 這些通常是由一個簡單的用戶自定義函數去解決的&#xff08;即&#xff0c;自帶的 “isNumeric” 函數&#xff09; 例如 public static boolean…

小程序支付api密鑰_如何避免在公共前端應用程序中公開您的API密鑰

小程序支付api密鑰問題 (The Problem) All you want to do is fetch some JSON from an API endpoint for the weather, some book reviews, or something similarly simple.您要做的就是從API端點獲取一些有關天氣的JSON&#xff0c;一些書評或類似的簡單內容。 The fetch qu…

永無止境_永無止境地死:

永無止境Wir befinden uns mitten in der COVID-19-Pandemie und damit auch im Mittelpunkt einer medialen Geschichte, die durch eine noch nie dagewesene Komplexitt und Dynamik gekennzeichnet ist. Wie kann Informationsdesign helfen, diese Explosion von Nachrich…

HDU4612 Warm up —— 邊雙聯通分量 + 重邊 + 縮點 + 樹上最長路

題目鏈接&#xff1a;http://acm.split.hdu.edu.cn/showproblem.php?pid4612 Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 7206 Accepted Submission(s): 1681 Problem DescriptionN planets are …

Android sqlite load_extension漏洞解析

路人甲 2015/09/25 14:540x01 sqlite load_extensionSQLite從3.3.6版本&#xff08;http://www.sqlite.org/cgi/src/artifact/71405a8f9fedc0c2&#xff09;開始提供了支持擴展的能力&#xff0c;通過sqlite_load_extension API&#xff08;或者load_extensionSQL語句&#xf…

去除Java字符串中的空格

問題&#xff1a;去除Java字符串中的空格 俺有一個像這樣的字符串 mysz "namejohn age13 year2001";我想要去除字符串里面的空格。我嘗試使用 trim() &#xff0c;但是呢它只去除了字符串前后的空格。我也嘗試用 ("\W", “”)&#xff0c;但是它把也給搞…

谷歌瀏覽器bug調試快捷鍵_Bug壓榨初學者指南:如何使用調試器和其他工具查找和修復Bug

谷歌瀏覽器bug調試快捷鍵As web developers, it often feels like we spend more time fixing bugs and trying to solve problems than we do writing code. In this guide well look at some common debugging techniques, so lets get stuck in.作為Web開發人員&#xff0c;…

吳恩達神經網絡1-2-2_圖神經網絡進行藥物發現-第1部分

吳恩達神經網絡1-2-2預測溶解度 (Predicting Solubility) 相關資料 (Related Material) Jupyter Notebook for the article Jupyter Notebook的文章 Drug Discovery with Graph Neural Networks — part 2 圖神經網絡進行藥物發現-第2部分 Introduction to Cheminformatics 化學…

再利用Chakra引擎繞過CFG

xlab 2015/12/24 15:00Author:[email protected]0x00 前言本文源自一次與TK閑聊&#xff0c;期間得知成功繞過CFG的經過與細節(參考&#xff1a;[利用Chakra JIT繞過DEP和CFG])。隨即出于對技術的興趣&#xff0c;也抽出一些時間看了相關的東西&#xff0c;結果發現了另一處繞…

論文搜索源

中國科學院文獻情報中心 見下圖 中國計算機學會推薦國際學術會議和期刊目錄 EI學術會議中心,        engieer village 轉載于:https://www.cnblogs.com/cxy-941228/p/7693097.html

重學TCP協議(10)SYN flood 攻擊

1.SYN flood 攻擊 SYN Flood&#xff08;半開放攻擊&#xff09;是一種拒絕服務&#xff08;DDoS&#xff09;攻擊&#xff0c;其目的是通過消耗所有可用的服務器資源使服務器不可用于合法流量。通過重復發送初始連接請求&#xff08;SYN&#xff09;數據包&#xff0c;攻擊者能…

大數據入門課程_我根據數千個數據點對互聯網上的每門數據科學入門課程進行了排名...

大數據入門課程by David Venturi大衛文圖里(David Venturi) A year ago, I dropped out of one of the best computer science programs in Canada. I started creating my own data science master’s program using online resources. I realized that I could learn everyt…

python 數據框缺失值_Python:處理數據框中的缺失值

python 數據框缺失值介紹 (Introduction) In the last article we went through on how to find the missing values. This link has the details on the how to find missing values in the data frame. https://medium.com/kallepalliravi/python-finding-missing-values-in-…

Spring Cloud 5分鐘搭建教程(附上一個分布式日志系統項目作為參考) - 推薦

http://blog.csdn.net/lc0817/article/details/53266212/ https://github.com/leoChaoGlut/log-sys 上面是我基于Spring Cloud ,Spring Boot 和 Docker 搭建的一個分布式日志系統. 目前已在我司使用. 想要學習Spring Cloud, Spring Boot以及Spring 全家桶的童鞋,可以參考學習,如…

51nod1832(二叉樹/高精度模板+dfs)

題目鏈接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId1832 題意: 中文題誒~ 思路: 若二叉樹中有 k 個節點只有一個子樹, 則答案為 1 << k. 詳情參見:http://blog.csdn.net/gyhguoge01234/article/details/77836484 代碼: 1 #include <iostream&g…