RESTful是一種設計風格不是標準,關注核心是要處理的資源,通過RUL觸發執行。是一種比RPC(遠程調用)更輕量級、更安全的服務端和客戶端交互方式,基於這個風格設計的軟件可以更簡潔,更有層次,更易於實現緩存等機制。可有多種實現方式,如java中spring
一、冪等性和安全:
1.冪等性
數學概念: f(f(x)) = f(x),x被函數f作用一次和無限次結果一樣,即冪等,反之非冪等。
軟件系統:某個函數或接口使用相同的參數調用一次或無限次,造成影響相同,不會產生災難性後果
2.HTTP的冪等性(常用):
GET方法,用於獲取資源,不管調用多少次接口,不會導致服務器狀態改變(日誌和訪問計數器外),冪等。
PUT它直接把實體部分的數據替換到服務器的資源,我們多次調用它,只會產生一次影響冪等
DELETE 調用一次和多次對資源產生影響是相同的,冪等
POST每次調用都會產生新的資源,非冪等
調用HTTP冪等方法(GET/PUT/DELETE)是安全的,打個比方,GET方法內的邏輯,不能對資源進行非冪等操作(i++)。冪等約束對於服務安全性很重要
二、RPC和RESTful:
1.RPC (遠程調用)樣式的 Web 服務的客戶端將一個裝滿數據的信封(包括方法和參數信息)通過 HTTP 發送到服務器。服務器打開信封並使用傳入參數執行指定的方法。方法的結果打包到一個信封並作爲響應發回客戶端。客戶端收到響應並打開信封。它忽略 HTTP 的大部分特性且僅支持 POST 方法,HTTP只是一個傳輸層的協議,SOAP是應用層協議。
2.RESTful規範中,接口的設計核心是面向資源的,每一個資源都有一個唯一確定的地址,資源是通過唯一地址url進行暴露,資源本身是方法調用的目標,方法列表對所有資源都是一樣的,這些方法都是HTTP標準方法,常用的有:GET、POST、PUT、DELETE。
HTTP協議成應用層協議,在性能效率優於RPC。
RESTful通過HTTPURL來觸發,不使用soap的xml命名空間
Eg:(針對book資源的操作)
String getUrl="http://localhost:8080/webservice/book/19";(HTTP GET方法查id=19)
String deleteUrl="http://localhost:8080/webservicebook?bookId=5";(HTTP DELETE方法 刪除 bookId=5)
String postUrl="http://localhost:8080/webservice/book"(HTTP POST 增加book,參數HTTTP請求體)
String putUrl="http://localhost:8080/webservice/book"(HTTP PUT修改book,參數HTTTP請求體)
重要的約束:
可尋址性:暴露資源都有一個唯一確定的URL
URL:具有可讀性,原則上不適用動詞
統一接口:對任何資源的操作通過HTTP GET(讀) POST(增) PUT(改) DELETE(刪)
安全性:HTTP GET/PUT/DELETE操作必須符合冪等性約束。非冪等方法POST前後端代碼設計控制其安全。對於可讀可寫的服務,通過Token認證
無狀態性:HTTP的無狀態性,分佈式系統中,每一次請求獨立,負載均衡分發請求
三、RESTful設計一般步驟:
參考:RESTful Web Service(中文版)