RESTful

RESTful

RESTful架構:一種軟件的架構風格,設計風格, 爲客戶端和服務端的交互提供一組設計原則和約束條件。若是一個架構符合REST的約束條件和原則,就稱它爲RESTful架構。 REST與技術無關,表明的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯爲「表徵狀態轉移」或「表現層狀態轉化」。css

web服務交互

在瀏覽器中能看到的每一個網站,都是一個web服務。在提供每一個web服務的時候, 都須要先後端交互,先後端交互就必定有一些實現方案,一般叫web服務交互方案。html

目前主流的三種web服務交互方案:前端

  • REST ( Representational State Transfer)表徵性狀態轉移【這裏所說的表徵性,其實指的就是資源。一般稱爲資源狀態轉移。】
  • SOAP (Simple Object Access Protocol) 簡單的對象訪問協議
  • XML-RPC (XML Remote Procedure Call)基於XML的遠程過程調用

什麼是URI,URL

  • 資源:任何事物,只要有被引用到的必要,它就是一個資源。資源能夠是一個實體,也能夠是抽象概念。好比在瀏覽器中看到的文本,視頻,圖片等等都是實體資源。也能夠是抽象的概念,好比兩我的的關係......
  • URI(統一資源標誌符)是給資源進行標識的,在web中的惟一標識就是URI
  • URL(統一資源定位符)是描述資源地址的。URL能夠說是URI的子集,經過定位的方式實現的URI
  • URI相似身份證是惟一的,URL相似家庭住址xx省/xx市/xx村/xx號街道/xx號樓/Alex

統一資源接口

  • 咱們能夠經過URL去訪問到資源,對資源會有不少不一樣的操做,增刪改查
  • 之前可能會爲了這個增長新設計一個URL,這個URL就是對數據進行增長的, 還會爲了更新和刪除分別設計一個URL
  • 如今不用了,只有一個URL,而後根據HTTP請求方式的不一樣,對資源進行不一樣的操做,這個就是是統一資源接口
  • 必定要遵循HTTP請求方法的語義,也就是說POST請求就在新增數據等....

資源的表述

  • 資源的表述其實就是資源的展示形式,客戶端和服務端傳輸的都是資源的表述,而不是資源自己
  • 例如文本資源能夠採用html、xml、json等格式,圖片可使用PNG或JPG展示出來
  • 那麼客戶端如何知道服務端提供哪一種表述形式呢? 能夠經過HTTP內容協商,客戶端能夠經過Accept頭請求一種特定格式的表述,服務端則經過Content-Type告訴客戶端資源的表述形式。
  • 這些資源的表述呈如今頁面上,就是資源狀態。

狀態轉移

  • 咱們在看頁面的時候,從當前資源的表述(也能夠說狀態或者表現層)會跳轉到其餘的資源狀態
  • 服務端經過超媒體告訴客戶端當前狀態有哪些後續狀態能夠進入
  • 這些相似"下一頁"之類的連接起的就是這種推動狀態的做用——指引你如何從當前狀態進入下一個可能的狀態

REST風格特色

  • (1)在web中,只要有被引用的必要都叫資源。
  • (2)每一個URI表明一個資源,獨一無二的。
  • (3)客戶端經過HTTP的方法,對服務器端資源進行操做;
  • (4)客戶端和服務器之間,傳遞這種資源的某種表現層;
  • (5)經過超連接的指引,實現"表現層狀態轉移"。

RESTful規範

  1. 路徑:面向資源編程
    • 每一個URL表明一種資源,URL中儘可能不要用動詞,要用名詞(可複數)。
    • https://api.example.com/v1/zoos
    • https://api.example.com/v1/animals
    • https://api.example.com/v1/employees
  2. method:根據method不一樣,進行不一樣的操做
    • GET/POST/PUT/DELETE/PATCH
    • GET :從服務器取出資源(一項或多項)
    • POST :在服務器新建一個資源
    • PUT :在服務器更新資源(客戶端提供改變後的完整資源)
    • PATCH :在服務器更新資源(客戶端提供改變的屬性)
    • DELETE :從服務器刪除資源
  3. 版本:在URL中體現版本
    • https://www.bootcss.com/v1/mycss
    • https://v1.bootcss.com/mycss
  4. 域名:在URL中體現是不是API
    • https://www.bootcss.com/api/mycss
    • https://api.bootcss.com/mycss
  5. 過濾:經過在url上傳參的形式傳遞搜索條件
    • https://api.example.com/v1/zoos?limit=10:指定返回記錄的數量
    • https://api.example.com/v1/zoos?offset=10:指定返回記錄的開始位置
    • https://api.example.com/v1/zoos?page=2&per_page=100:指定第幾頁,以及每頁的記錄數
    • https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回結果按照哪一個屬性排序,以及排序順序
    • https://api.example.com/v1/zoos?animal_type_id=1:指定篩選條件
  6. 協議:儘可能使用HTTPS
    • https://www.bootcss.com/v1/mycss
  7. 狀態碼:
    • 1** 信息,服務器收到請求,須要請求者繼續執行操做
    • 2** 成功,操做被成功接收並處理
    • 3** 重定向,須要進一步的操做以完成請求
    • 4** 客戶端錯誤,請求包含語法錯誤或沒法完成請求
    • 5** 服務器錯誤,服務器在處理請求的過程當中發生了錯誤
  8. 返回值:針對不一樣操做,服務器向用戶返回的結果應該符合如下規範
    • GET請求 返回查到全部或單條數據
    • POST請求 返回新增的數據
    • PUT請求 返回更新數據
    • PATCH請求 局部更新 返回更新整條數據
    • DELETE請求 返回值爲空
  9. 錯誤處理:
    • 狀態碼是4xx時,應返回錯誤信息,error當作key。
    • { error: "Invalid API key" }
  10. Hypermedia API: 若是遇到須要跳轉的狀況 攜帶調轉接口的URL
    • RESTful API最好作到Hypermedia,即返回結果中提供連接,連向其餘API方法,使得用戶不查文檔,也知道下一步應該作什麼。
 ret = {
                code: 1000,
                data:{
                    id:1,
                    name:'小強',
                    depart_id:http://www.luffycity.com/api/v1/depart/8/
                },
                link: {
                  "rel":   "collection https://www.example.com/zoos",
                  "href":  "https://api.example.com/zoos",
                  "title": "List of zoos",
                  "type":  "application/vnd.yourformat+json"
                }
            }

狀態碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
200 OK - [GET]:服務器成功返回用戶請求的數據,該操做是冪等的(Idempotent)。
201 CREATED - [POST / PUT / PATCH]:用戶新建或修改數據成功。
202 Accepted - [ * ]:表示一個請求已經進入後臺排隊(異步任務)
204 NO CONTENT - [DELETE]:用戶刪除數據成功。
400 INVALID REQUEST - [POST / PUT / PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操做,該操做是冪等的。
401 Unauthorized - [ * ]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。
403 Forbidden - [ * ] 表示用戶獲得受權(與 401 錯誤相對),可是訪問是被禁止的。
404 NOT FOUND - [ * ]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操做,該操做是冪等的。
406 Not Acceptable - [GET]:用戶請求的格式不可得(好比用戶請求JSON格式,可是隻有XML格式)。
410 Gone - [GET]:用戶請求的資源被永久刪除,且不會再獲得的。
422 Unprocesable entity - [POST / PUT / PATCH] 當建立一個對象時,發生一個驗證錯誤。
500 INTERNAL SERVER ERROR - [ * ]:服務器發生錯誤,用戶將沒法判斷髮出的請求是否成功。
502 :網關不可用
503 :服務不可用   Server Unavailable / / 服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
504 :網關超市
505 :版本不支持

爲何要作先後端分離的項目

  1. 知足多端適配
    • 隨着移動端的興起,如今公司產品不僅限於pc端的,包括Android,IOS。
    • 按照之前的方式,後端其實就要有多套,pc一套,APP端兩套。
    • 開發成本以及開發效率會很低,若是先後端分離,後端只須要有一套就能夠了
    • 後端只提供接口,前端不論是pc仍是APP均可以去調用數據。
  2. 先後端職責不清晰
    • 咱們的模板語言究竟是前端寫仍是後端寫
  3. 開發效率 先後端互相等待
  4. 前端配合後端,只寫模板語言,能力受限
  5. 後端開發語言與模板語言耦合度較高,依賴開發語言,更換後端語言的成本加大。
相關文章
相關標籤/搜索