REST = HTTP動詞(GET POST PUT DELETE)操作 + 服務器暴露資源URI,最后返回狀態碼(充分利用HTTP自身的特征,而不僅僅是把HTTP當作傳輸協議。Rest協議是面向資源的,SOAP是面向服務的),表現形式可以是JSON XML BIN,舉例很清楚


好處是,操作系統或者瀏覽器,可以重復利用它們內置的緩存機制等等。

增刪改查都是一個地址,具體靠http頭部信息判斷。

利用HTTP協議語義構建的語義化、可緩存的接口。

URL定位資源,用HTTP動詞(GET,POST,DELETE,DETC)描述操作。

-----------------------------------------------------------------------------------------------

“表現層狀態轉移”?這是人話嗎?
首先,之所以晦澀是因為前面主語被去掉了,全稱是 Resource Representational State Transfer:通俗來講就是:資源在網絡中以某種表現形式進行狀態轉移。分解開來:
Resource:資源,即數據(前面說過網絡的核心)。比如 newsfeed,friends等;
Representational:某種表現形式,比如用JSON,XML,JPEG等;
State Transfer:狀態變化。通過HTTP動詞實現。


作者:覃超
鏈接:https://www.zhihu.com/question/27785028/answer/48096396
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

-----------------------------------------------------------------------------------------------

作者:suhua su
鏈接:https://www.zhihu.com/question/28557115/answer/47846156
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

1、REST 是面向資源的,這個概念非常重要,而資源是通過 URI 進行暴露。
URI 的設計只要負責把資源通過合理方式暴露出來就可以了。對資源的操作與它無關,操作是通過 HTTP動詞來體現,所以REST 通過 URI 暴露資源時,會強調不要在 URI 中出現動詞。

比如:左邊是錯誤的設計,而右邊是正確的
GET /rest/api/getDogs --> GET /rest/api/dogs 獲取所有小狗狗 
GET /rest/api/addDogs --> POST /rest/api/dogs 添加一個小狗狗 
GET /rest/api/editDogs/:dog_id --> PUT /rest/api/dogs/:dog_id 修改一個小狗狗 
GET /rest/api/deleteDogs/:dog_id --> DELETE /rest/api/dogs/:dog_id 刪除一個小狗狗 

左邊的這種設計,很明顯不符合REST風格,上面已經說了,URI 只負責准確無誤的暴露資源,而 getDogs/addDogs...已經包含了對資源的操作,這是不對的。相反右邊卻滿足了,它的操作是使用標准的HTTP動詞來體現。

2、REST很好地利用了HTTP本身就有的一些特征,如HTTP動詞、HTTP狀態碼、HTTP報頭等等
REST API 是基於 HTTP的,所以你的API應該去使用 HTTP的一些標准。這樣所有的HTTP客戶端(如瀏覽器)才能夠直接理解你的API(當然還有其他好處,如利於緩存等等)。REST 實際上也非常強調應該利用好 HTTP本來就有的特征,而不是只把 HTTP當成一個傳輸層這么簡單了。

HTTP動詞
GET     獲取一個資源 
POST    添加一個資源 
PUT     修改一個資源 
DELETE  刪除一個資源 

實際上,這四個動詞實際上就對應着增刪改查四個操作,這就利用了HTTP動詞來表示對資源的操作。

HTTP狀態碼
200 OK 
400 Bad Request 
500 Internal Server Error
在 APP 與 API 的交互當中,其結果無非就三種狀態:
  • 所有事情都按預期正確執行完畢 - 成功
  • APP 發生了一些錯誤 – 客戶端錯誤
  • API 發生了一些錯誤 – 服務器端錯誤

這三種狀態與上面的狀態碼是一一對應的。

HTTP報頭
Authorization 認證報頭 
Cache-Control 緩存報頭 
Cnotent-Type  消息體類型報頭 
......

報頭還有很多,不一一列舉。HTTP報頭是描述HTTP請求或響應的元數據,它的作用是客戶端 與 服務器端進行相互通信時,告訴對方應該如何處理本次請求。

-----------------------------------------------------------------------------------------------

rest協議是面向資源的

假如要管理一些用戶,那么將用戶看作是一種資源:


get /users/{userId} 獲取userId對應的user信息
post /users 創建一個新的user
put /users/{userId} 更改userId對應的user信息
delete /users/{userId} 刪除userId對應的user。

soap是面向服務的


還是管理用戶,將對用戶的操作看成服務:


post /users/getUser
post /users/creatUser
post /users/updateUser
post /users/deleteUser


作者:yuankai deng
鏈接:https://www.zhihu.com/question/28557115/answer/41267646
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

-----------------------------------------------------------------------------------------------

作者:Jerry Zhang
鏈接:https://www.zhihu.com/question/27785028/answer/118036452
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

參看一個例子吧:GitHub - hot13399/spring-mvc-REST

  • GET
    http://localhost:8080/spring-mvc-REST/students 
    
    可以獲得所有的學生信息。
  • GET
     http://localhost:8080/spring-mvc-REST/students/1
    
    可以獲得id為“1”的學生信息。
  • POST 以下JSON內容
{"id":0,"firstName":"Wang","lastName":"Di","gender":"M","birthday":538300800000,"uscId":"1234509876","gpa":3.62,"mentorId":null,"department":"Computer Science"}
http://localhost:8080/spring-mvc-REST/student
,可以添加一個學生信息。
  • PATCH以下內容
{"gpa":3.62}
http://localhost:8080/spring-mvc-REST/students/1
可以修改學生ID為1的學生的GPA.
  • PUT以下內容(Full Content)
{"firstName":"Wang","lastName":"Di","gender":"M","birthday":538300800000,"uscId":"1234509876","gpa":3.62,"mentorId":null,"department":"Computer Science"}
http://localhost:8080/spring-mvc-REST/students/1
可以替換掉這個對象
  • DELETE
    http://localhost:8080/spring-mvc-REST/students/1
    
    ,可以刪除學生ID為1的信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM