深入理解 RESTful Api 架構

2021-02-23 PHP開源社區

一些常見的誤解

不要以為 RESTful Api  就是設計得像便於 SEO 的偽靜態,例如一個 Api 的 URL 類似於 http://xxx.com/blog/1 ,我們可以通過瀏覽器訪問該 URL 而讀取文章,但是這並不代表著它就是 RESTful Api 。

也不要認為URL 裡有 queryString 就不是 RESTful Api ,例如 http://xxx.com/users/?page=10&page_size=30

更不要認為 HTTP + JSON 就是 RESTful ApI 了。

REST 和 HTTP/1.1 

Roy Fielding (Apache HTTP 伺服器的核心開發者,Apache 軟體基金會的合作創始人,HTTP/1.1 協議專家組的負責人)總結了一套理論框架,然後使用這套理論框架中的指導原則,來指導HTTP/1.1協議的設計方向。後來他在其的博士學位論文 Architectural Styles and the Design of Network-based Software Architectures 中更為系統、嚴謹地闡述了這套理論框架,並且使用這套理論框架推導出了一種新的架構風格,並且為這種架構風格取了一個令人輕鬆愉快的名字 REST。

想必通過這個你已經明白了 REST 和 HTTP/1.1 的密不可分的關係了吧。HTTP/1.1 的很多特性就是 REST 的特性,比如連接的無狀態性。還有後面說的 REST 五大特性都和 HTTP/1.1 協議密不可分。

RESTful Api 與 SOAP Web API 在 URL 形式上的對比從設計一個刪除評論的 api 說起 

我們可以這樣設計成類似於:

http://mengkang.net/?method=comment.del&id=x ①

http://mengkang.net/comment/del/id/x ②

或者其他形式的 url。

而 RESTful Api 則是:

[DELETE] http://mengkang.net/comments/1 ③

我們對比可以發現①和② URL 中,都有del的動作指示。

SOAP Web API採用RPC風格,它採用面向功能的架構,所以我們在設計SOAP Web API的時候首相考慮的是應高提供怎樣的功能(或者操作)。

而 RESTful Api 是面向資源的架構。是查詢、新增、修改、刪除,都該資源無關。

所以我們在③ URL 中沒有看到del的關鍵字,對比②和③最為明顯。

進一步認識 RESTful Api 

我們知道 URL 全稱為「統一資源定位符(Uniform Resource Locator)」,用於描述 Web 資源所在的位置。RESTful Api 是以 HTTP 協議為強烈依託的,將類似於①和②這種以功能為主導的URL風格捨棄,還原 URL 的本質,它的宗旨就是一個 URL 就應該是一個資源,不能包含任何動作。

[POST]     http://mengkang.net/users   // 新增
[GET]      http://mengkang.net/users/1 // 查詢
[PATCH]    http://mengkang.net/users/1 // 更新
[PUT]      http://mengkang.net/users/1 // 覆蓋,全部更新
[DELETE]   http://mengkang.net/users/1 // 刪除

PUT和PATCH的功能都可以代表更新,但略有不同,PUT大多時候表示更新該資源的全部信息,而PATCH則更新部分信息。

PUT和POST又一些功能的重疊,都可以是新建一個資源,POST時,新建資源的地址是由伺服器返回給客戶端的。也就是說客戶端在發送POST請求資源之前還無法預知該資源的地址,這在我們的 Api 開發中非常常見,新建一個帖子,新建一條評論,都如此。

而資源的地址是客戶端預先知道的情況則比較少。也有人如此設計而使用PUT,比如需要對 github 上的某人的項目 star ,則可能會設計成:http://github.com/xxx/zhoumengkang/projectname/star

 這裡把「對這個項目已經點讚過」看成了一個資源,那麼就可以用PUT,因為要刪除這個資源時,還是訪問這個 URL。

關於這些功能上有交集的地方,可能後面會有一些更加標準的規範或者協議吧。

最後說下HEAD和OPTIONS,HEAD請求的是資源的元數據,比如一張照片,的元數據則可能包含了,照片拍攝的設備,地點,時間等。伺服器一般將對應資源的元數據置於響應的報頭集合返回給客戶端,這樣的響應一般不具有主體部分。OPTIONS則是發送一種「探測」請求以確定針對某個目標地址的請求必須具有怎樣的約束(比如應該採用怎樣的HTTP方法以及自定義的請求報頭),然後根據其約束髮送真正的請求。

關於過濾篩選,排序和 token 等 query string 是支持使用,和唯一資源的概念並不衝突。

我所理解的無狀態性和唯一資源對 Api Url 的設計指導

舉一個實際的例子,用戶黑名單的 CURD。我們可是設計成

[GET]      /blacklist
[PUT]       /blacklist/{id} #把 id 加入到當前授權用戶的黑名單中
[DELETE]   /blacklist/{id}

如上的 api 設計中,首先如上的 url 設計中,通過授權碼中獲取登錄用戶 uid。則是有狀態的了,其次因為所有的用戶訪問的資源都是同一個地址,這與唯一資源的概念是相違背的。如果是無狀態的,那麼就與唯一資源的概念相吻合了。(這只是 restful 所建議的,實際是否需要完全遵守視情況而定)

[GET]      /user/{uid}/blacklist
[PUT]       /user/{uid}/blacklist/{id}  #把 id 加入到當前授權用戶的黑名單中
[DELETE]   /user/{uid}/blacklist/{id}

REST的五大特性

資源(Resource)

資源的表述(Representation)

狀態轉移(State Transfer)

統一接口(Uniform Interface)

超文本驅動(Hypertext Driven)

資源的概念是 RESTful 裡面最重要的一個概念,很容易被我們忽視和誤解,所以就重點闡述了這一特性。

Server 端代碼的基本設計思想

按照 RESTful Api 的規範,嚴格來說根據endpoint找到在 server 端映射成一個資源對象,例如通過 http://mengkang.net/users/1 找到UserResource對象

而在這個對象裡對應著該資源支持的 Http 協議的方法。如果一個對象支持7種方式的請求,則類似於:

public class UserResource {
    private User user;
    public UserResource() {
    }
    public UserResource(int id) {
        //從數據查詢處該用戶的數據
        String name = "xxx";
        short age = 23;
        user = new User(id,name,age);
    }
    /**
     * 獲取單個用戶
     * 從 new UserResource(int) 開始
     * @return
     */
    public User get(){
        return user;
    }
    /**
     * 覆蓋用戶的全部信息
     * 從 new UserResource(int) 開始
     * @return
     */
    public boolean put(){
        return true;
    }
    /**
     * 只更新用戶的部分信息
     * 從 new UserResource(int) 開始
     * @return
     */
    public boolean patch(){
        return true;
    }
    /**
     * 創建一個 UserResource
     * @return
     */
    public int post(){
        return 1;
    }
    /**
     * 刪除用戶
     * @return
     */
    public boolean delete(){
        return true;
    }
}

如果有關注的 api 那麼對於該用戶的 star 操作則應新建一個UserStarResource資源對象,因為每個資源最多只有這7中方法,構造方法除外,而不能有其他的相關的動作方法。

假如我們規定 URL 為 http://mengkang.net/user/1/star 表示是訪問者對 id 為 1 的這個用戶的 star 狀態的一個資源。(當前訪問者的信息通過 query string 傳遞 auth token 的形式獲取)

public class UserStarResource {
    public boolean get(){
        return true;
    }
    public boolean post(){
        return true;
    }
    public boolean delete(){
        return true;
    }
}

REST 狀態碼

理論上來說我們應該以 Http response status code 作為客戶端的標準,而不是在 Http body 體裡面定義。這樣客戶端的能夠更快速的獲取服務端的響應狀態碼。

但是由於國內某些網絡商會劫持狀態碼非200的請求,跳轉到他們的廣告地址。所以大家還是考慮國內的實際情況。

REST 架構風格約束

客戶-伺服器(Client-Server)通信只能由客戶端單方面發起,表現為請求-響應的形式。

無狀態(Stateless)通信的會話狀態(Session State)應該全部由客戶端負責維護。

緩存(Cache)響應內容可以在通信鏈的某處被緩存,以改善網絡效率。

統一接口(Uniform Interface)通信鏈的組件之間通過統一的接口相互通信,以提高交互的可見性。

分層系統(Layered System)通過限制組件的行為(即,每個組件只能「看到」與其交互的緊鄰層),將架構分解為若干等級的層。

以上內容希望幫助到大家,有需要的可以添加下方二維碼進群交流學習新技術。

來源:

https://blog.csdn.net/jj546630576/article/details/77948445

好文連接:

優化MYSQL查詢步驟,提高你的20%的工作效率

PHP使用swoole改造laravel應用

如果你想和PHP大神交流,添加微信,拉你入群

如果你想獲得更多學習資料,添加微信,送你資源

相關焦點

  • 我是如何根據豆瓣api來理解Restful API設計的
    REST有著優雅、簡潔的特性,本文是根據豆瓣api來談談自己對restful的一些理解。2.URI規範URI 的格式:URI的格式定義如下:  URI = scheme "://" authority "/" path [ "?" query ] [ "#" fragment ]uri代表的是一種資源,要做到優雅、簡潔。
  • 深入理解什麼是RESTful API ?
    一、理解RESTful架構越來越多的人開始意識到,網站即軟體,而且是一種新型的軟體。  這種"網際網路軟體"採用客戶端/伺服器模式,建立在分布式體系上,通過網際網路通信,具有高延時(high latency)、高並發等特點。  網站開發,完全可以採用軟體開發的模式。但是傳統上,軟體和網絡是兩個不同的領域,很少有交集;軟體開發主要針對單機環境,網絡則主要研究系統之間的通信。
  • 理解RESTful API 架構設計規範與實踐
    RESTful  架構是目前流行的一種網際網路應用架構。如果把網站,移動應用從伺服器到前端,從整體上看作是一個軟體,它就是一個層次清楚,功能強,擴展方便,適宜通信的架構規範。第四章描述了設計 REST 的動機:「為 Web 應該如何運轉創建一種架構模型, 使之成為 Web 協議標準的指導框架」。第五章從一個沒有約束的空架構開始,不斷的添加約束,從而使此架構進化為 Web 所需要的架構。所以,REST 是一組架構約束。
  • RESTful API 介紹及設計
    如果這樣寫的話,很容易造成大家理解api不統一。有可能前端和後端人員各自為政,用不同的動詞來操作url,造成大家開發理解的不統一。類似的還有:/createUsers/updateUserInfo/deleteUser?id=2統一標準:前後端人員統一用http規定的幾個動作來進行url相關的操作。
  • Restful API設計規範
    在當前流行的前後端分離架構,人們發現原來這套用於超文本傳輸的協議是如此適合用於設計基於網際網路的api接口,基於http動詞以及標準的http status返回信息,能夠非常好地描述api的特性,並且可讀性非常好。
  • 理解 RESTful API 設計規範
    REST與技術無關,它代表的是一種軟體架構風格,REST它是 Representational State Transfer的簡稱,中文的含義是: "表徵狀態轉移" 或 "表現層狀態轉化"。它是基於HTTP、URI、XML、JSON等標準和協議,支持輕量級、跨平臺、跨語言的架構設計。一、理解為什麼要使用RESTful API設計規範?
  • RESTful API 設計指南
    我以前寫過一篇《理解RESTful架構》,探討如何理解這個概念。今天,我將介紹RESTful API的設計細節,探討如何設計一套合理、好用的API。我的主要參考了兩篇文章(1,2)。一、協議API與用戶的通信協議,總是使用HTTPs協議。
  • 如何理解RESTful API設計規範?
    REST與技術無關,它代表的是一種軟體架構風格,REST它是 Representational State Transfer的簡稱,中文的含義是: "表徵狀態轉移" 或 "表現層狀態轉化"。它是基於HTTP、URI、XML、JSON等標準和協議,支持輕量級、跨平臺、跨語言的架構設計。為什麼使用RESTful API設計規範?
  • RESTful架構和RESTful API設計總結
    但是從字面上理解REST(Representational State Transfer, 表現層狀態轉移)是非常抽象的。因此,本篇文章試圖將REST進行拆解,分別從以下幾個部分來進行解讀:Resource 資源REST忽略了主語,全稱應該是資源的表現層狀態轉移。
  • axios中restful api的使用
    1引子在前端發送網絡請求的時候,現在最經常使用的是axios, 而axios的api中我們(確切說是我)最常用的就是post,而其他api很少有用到的場景。最近在做一個簡單需求(增刪改查)的時候,後端給的接口是restful風格的。看看吧:嗯,看到上圖我還沒感覺到什麼,接著看:
  • RESTful API 編寫指南
    我在《RESTful 架構風格概述》中,對認證機製做了更加詳細的描述,有興趣的同學不妨閱讀相關章節。權限機制是對API請求更近一步的限制,只有通過認證的用戶符合權限要求,才能訪問API。全局型的權限機制容易理解,實現也簡單,有很多開源庫可做備選方案,不少完善的web開發框架,也會集成相關的權限邏輯,object permission 相對難複雜一點,但也有很多典型的應用場景,如多人博客系統中,作者對自己文章的編輯權限即為object permission,其對應的開源庫也有很多。
  • 教你 10 分鐘構建一套 RESTful API 服務( 中 )
    if __name__ == '__main__':    app.run()從 flask_restful 文件中導入 Api、Resource 兩個類,使用上面的 app 對象,構建一個 api 對象,接著準備一個列表數據from flask_restful import Api,Resourceapp
  • Laravel 開發 RESTful API 的一些心得
    使用 swagger-ui+ swagger-edit:下載swagger-ui(https://github.com/swagger-api/swagger-ui)只需要 dist目錄的東西(其他可以刪除了)下載swagger-editor(https://github.com/swagger-api/swagger-editor)
  • php Restful設計思路與步驟
    是基於資源的,面向資源架構風格(一個連結,一張圖、一個文本等等)2、restful的http協議   2.1 url:        2.1.1 port 服務埠,默認為802.1.2 path 訪問資源的路徑        2.1.3 query-string  發送給http伺服器的數據
  • 面試官:說說你對 RESTful 的理解?
    用他自己的原話說:我寫這篇文章的目的是:在符合架構原理前提下,理解和評估基於網絡的應用軟體的架構設計,得到一個功能強、性能好、適宜通信的架構。需要注意的是REST並沒有一個明確的標準,而更像是一種設計的風格,滿足這種設計風格的程序或接口我們稱之為RESTful(從單詞字面來看就是一個形容詞)。
  • 淺談 RESTful API
    RESTful 是一種軟體設計風格,由 Roy Thomas Fielding 在他 2000 年的論文中提出,Fielding 將他對網際網路軟體的架構原則,定名為 REST,即 Representational State Transfer 的縮寫,譯為表現層狀態轉化,也可理解為用 URL 定位資源,用 HTTP 方法描述操作。
  • Springboot 實現 Restful 服務,基於 HTTP / JSON 傳輸
    REST 是屬於 WEB 自身的一種架構風格,是在 HTTP 1.1 規範下實現的。Representational State Transfer 全稱翻譯為表現層狀態轉化。Resource:資源。比如 newsfeed;Representational:表現形式,比如用JSON,富文本等;State Transfer:狀態變化。通過HTTP 動作實現。
  • 後端開發必備的 RestFul API 知識
    相關閱讀:•http://www.ruanyifeng.com/blog/2014/05/restful_api.html(阮一峰,這篇文章大部分內容來源)•https://www.baeldung.com/spring-hateoas-tutorial(RestFul API Tutorial)•https://aisensiy.github.io/2017/06/04
  • 幹掉 RESTful API !
    REST作為一種現代網絡應用非常流行的軟體架構風格,自從Roy Fielding博士在2000年他的博士論文中提出來到現在已經有了20年的歷史。它的簡單易用性,可擴展性,伸縮性受到廣大Web開發者的喜愛。
  • Nodejs RESTFul架構實踐之api
    沒有粘性 session 的問題,因為在每個發送到伺服器的請求中這個請求的 token 都會被攔截。這些就是基於 token 的認證和通信中最明顯的優勢。基於 token 認證的理論和架構就說到這裡。下面上實例。