網站提供的每一個web服務都須要先後端交互,先後端交互的實現方案,一般叫做:web服務交互方案。css
1)REST(Representational State Transgfer)表述性狀態轉移html
REST是Roy Thomas Fielding博士於2000年在他的博士論文裏提出來的。python
REST相比SOAP更加簡潔,性能和開發效率也有突出的優點。git
2)SOAP(Simple Object Access Protoco)簡單的對象訪問協議github
SOAP服務則是以自己所定義的操做集,來訪問網絡上的資源。web
SOAP也是基於XML的,可是它不僅限於HTTP協議的傳輸,包括TCP協議,UDP協議均可以傳輸。數據庫
3)XML-RPC(XML Remote Procedure Call)基於XML的遠程過程調用django
XML-RPC是經過XML將調用函數封裝,並使用HTTP協議做爲傳送機制。後來在新的功能不斷被引入下,這個標準慢慢演變成爲今日的SOAP協定。編程
REST與技術無關,表明的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯爲「表徵狀態轉移」。json
這裏說的表徵性,其實就是資源。一般稱爲資源狀態轉移。
什麼事物,只要有被引用的必要,它就是一個資源。資源能夠是一個實體,也能夠是抽象概念。
實體資源很好理解,我的信息、手機號、視頻、圖片等等都是實實在在存在的實體。而兩我的的關係則是抽象的概念。
在網絡中要引用資源,資源必定要有一個標識,在web中惟一標識就是URI。
URI:統一資源標誌符(相似身份證號)。URL:統一資源定位符(相似家庭住址)。
URI是給資源進行標識的,URL是描述資源地址的。
經過這兩種方式均可以找到咱們的資源,其實URL能夠說是URI的子集,經過定位的方式實現的URI。
得到URL後,能夠經過URL去訪問到資源,但對資源會有不少不一樣的操做(增刪改查)。以前的方式是分別設計一個新的URL來對數據進行操做。
如今只須要一個URL,根據HTTP請求方式不一樣,對資源進行不一樣的操做,這就是統一資源接口。
資源的表述其實就是資源的展示形式,客戶端和服務端傳輸的都是資源的表述,而不是資源自己。
例如文本資源能夠採用html、xml、json等格式,圖片可使用PNG或JPG展示出來。
那麼客戶端如何知道服務端提供哪一種表述形式呢?
能夠經過HTTP內容協商,客戶端能夠經過Accept頭請求一種特定格式的表述,服務端則經過Content-Type告訴客戶端資源的表述形式。
這些資源的表述呈如今頁面上,就是咱們說的資源狀態。
看頁面的時候,從當前資源的表述(也能夠說狀態或者表現層)會跳轉到其餘的資源狀態。
服務端經過超媒體告訴客戶端當前狀態有哪些後續狀態能夠進入。
這些相似"下一頁"之類的連接起的就是這種推動狀態的做用——指引你如何從當前狀態進入下一個可能的狀態。
REST與技術無關,表明的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯爲「表徵狀態轉移」
REST從資源的角度類審視整個網絡,它將分佈在網絡中某個節點的資源經過URL進行標識,客戶端應用經過URL來獲取資源的表徵,得到這些表徵導致這些應用轉變狀態
全部的數據,無論是經過網絡獲取的仍是操做(增刪改查)的數據,都是資源,將一切數據視爲資源是REST區別與其餘架構風格的最本質屬性
對於REST這種面向資源的架構風格,有人提出一種全新的結構理念,即:面向資源架構(ROA:Resource Oriented Architecture)。
若是一個架構符合REST的約束條件和原則,咱們就稱它爲RESTful架構。一種軟件的架構風格,設計風格, 爲客戶端和服務端的交互提供一組設計原則和約束條件。
理解RESTful架構:http://www.ruanyifeng.com/blog/2011/09/restful.html
API與用戶的通訊協議,老是使用HTTPs協議。
應該將API的版本號放入URL。另外一種作法是,將版本號放在HTTP頭信息中,但不如放入URL方便和直觀。Github採用這種作法。
路徑又稱"終點"(endpoint),表示API的具體網址。
在RESTful架構中,每一個網址表明一種資源(resource),因此網址中不能有動詞,只能有名詞,並且所用的名詞每每與數據庫的表格名對應。通常來講,數據庫中的表都是同種記錄的"集合"(collection),因此API中的名詞也應該使用複數。
視網絡上任何東西都是資源,均使用名詞表示(可複數)
對於資源的具體操做類型,由HTTP動詞表示。
經常使用的HTTP動詞有下面五個,後面是對應的SQL命令。
還有兩個不經常使用的HTTP動詞:
示例:
- GET /zoos:列出全部動物園
- POST /zoos:新建一個動物園
- GET /zoos/ID:獲取某個指定動物園的信息
- PUT /zoos/ID:更新某個指定動物園的信息(提供該動物園的所有信息)
- PATCH /zoos/ID:更新某個指定動物園的信息(提供該動物園的部分信息)
- DELETE /zoos/ID:刪除某個動物園
- GET /zoos/ID/animals:列出某個指定動物園的全部動物
- DELETE /zoos/ID/animals/ID:刪除某個指定動物園的指定動物
若是記錄數量不少,服務器不可能都將它們返回給用戶。API應該提供參數,過濾返回結果。
經過在url上傳參的形式傳遞搜索條件
參數的設計容許存在冗餘,即容許API路徑和URL參數偶爾有重複。好比,GET /zoo/ID/animals 與 GET /animals?zoo_id=ID 的含義是相同的。
服務器向用戶返回的狀態碼和提示信息,常見的有如下一些(方括號中是該狀態碼對應的HTTP動詞)。
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 - [*]:服務器發生錯誤,用戶將沒法判斷髮出的請求是否成功。 更多看這裏:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
狀態碼是4xx時,應向用戶返回錯誤信息,通常來講,返回的信息中將error做爲鍵名,出錯信息做爲鍵值便可。
{ error: "Invalid API key" }
針對不一樣操做,服務器向用戶返回的結果應該符合如下規範。
GET /collection:返回資源對象的列表(數組) GET /collection/resource:返回單個資源對象 POST /collection:返回新生成的資源對象 PUT /collection/resource:返回完整的資源對象 PATCH /collection/resource:返回完整的資源對象 DELETE /collection/resource:返回一個空文檔
RESTful API最好作到Hypermedia,即返回結果中提供連接,連向其餘API方法,使得用戶不查文檔,也知道下一步應該作什麼。
好比,當用戶向api.example.com的根目錄發出請求,會獲得這樣一個文檔。
{"link": { "rel": "collection https://www.example.com/zoos", "href": "https://api.example.com/zoos", "title": "List of zoos", "type": "application/vnd.yourformat+json" }}
上面代碼表示,文檔中有一個link屬性,用戶讀取這個屬性就知道下一步該調用什麼API了。rel表示這個API與當前網址的關係(collection關係,並給出該collection的網址),href表示API的路徑,title表示API的標題,type表示返回類型。
Hypermedia API的設計被稱爲HATEOAS。Github的API就是這種設計,訪問api.github.com會獲得一個全部可用API的網址列表。
在url接口中推薦使用Https協議,讓網絡接口更加安全(Https是Http的安全版,即HTTP下加入 SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL(安全套接層協議));
https://www.bootcss.com/v1/mycss
https://v1.bootcss.com/mycss
https://www.bootcss.com/v1/mycss
https://v1.bootcss.com/mycss
不一樣的版本能夠有不一樣的接口,使其更加簡潔,清晰。
restful 提倡面向資源編程,因此在url接口中儘可能要使用名詞,不要使用動詞。
添加條件去篩選匹配:
https://www.bootcss.com/v1/mycss?page=3
能夠根據Http不一樣的method,進行不一樣的資源操做(5種方法:GET / POST / PUT / DELETE/ PATCH)
能夠經過狀態碼直接判斷服務器的響應信息。
1** 信息,服務器收到請求,須要請求者繼續執行操做
2** 成功,操做被成功接收並處理
3** 重定向,須要進一步的操做以完成請求
4** 客戶端錯誤,請求包含語法錯誤或沒法完成請求
5** 服務器錯誤,服務器在處理請求的過程當中發生了錯誤
應該有返回值,並且格式爲統一的json格式。
GET請求 返回查到全部或單條數據
POST請求 返回新增的數據
PUT請求 返回更新數據
PATCH請求 局部更新 返回更新整條數據
返回值攜帶錯誤信息。
若是遇到須要跳轉的狀況,攜帶跳轉接口的URL。
返回結果中要提供幫助連接,即API最好作到Hypermedia。
ret = { code: 1000, data:{ id:1, name:'小強', depart_id:http://www.luffycity.com/api/v1/depart/8/ } }