初識RESTful Web

參考借鑒:http://www.cnblogs.com/loveis715/p/4669091.html
一、定義
REST其實是一種組織Web服務的架構,而并不是我們想象的那樣是實現Web服務的一種新的技術,更沒有要求一定要使用HTTP。其目標是為了創建具有良好擴展性的分布式系統。與目前常見的web設計架構區別點在于,REST是以資源為中心,而常規web架構是以執行了什么任務為中心。

二、五大約束
1、使用客戶/服務器模型。客戶和服務器之間通過一個統一的接口來互相通訊。
2、層次化的系統。在一個REST系統中,客戶端并不會固定地與一個服務器打交道。
3、無狀態。在一個REST系統中,服務端并不會保存有關客戶的任何狀態。也就是說,客戶端自身負責用戶狀態的維持,并在每次發送請求時都需要提供足夠的信息。
4、可緩存。REST系統需要能夠恰當地緩存請求,以盡量減少服務端和客戶端之間的信息傳輸,以提高性能。
5、統一的接口。一個REST系統需要使用一個統一的接口來完成子系統之間以及服務與用戶之間的交互。這使得REST系統中的各個子系統可以獨自完成演化。(是REST服務設計的核心所在)

三、統一接口四個子約束
1、每個資源都擁有一個資源標識。每個資源的資源標識可以用來唯一地標明該資源。
2、消息的自描述性。在REST系統中所傳遞的消息需要能夠提供自身如何被處理的足夠信息。例如該消息所使用的MIME類型,是否可以被緩存等。
3、資源的自描述性。一個REST系統所返回的資源需要能夠描述自身,并提供足夠的用于操作該資源的信息,如如何對資源進行添加,刪除以及修改等操作。也就是說,一個典型的REST服務不需要額外的文檔對如何操作資源進行說明。
4、HATEOAS。即客戶只可以通過服務端所返回各結果中所包含的信息來得到下一步操作所需要的信息(客戶端僅可以決定資源ID),如到底是向哪個URL發送請求等。也就是說,一個典型的REST服務不需要額外的文檔標示通過哪些URL訪問特定類型的資源,而是通過服務端返回的響應來標示到底能在該資源上執行什么樣的操作。一個REST服務的客戶端也不需要知道任何有關哪里有什么樣的資源這種信息。

四、資源操作方式
1、GET 等冪且安全,讀取資源
2、DELETE 等冪 ,刪除資源
3、POST 不等冪,創建資源,ID由服務端創建
4、PUT 等冪,創建資源和更新整個資源,ID由客戶端創建,一般通過GUID和UUID
5、PATCH 等冪,更新部分資源

注:等冪性,是指每次操作結果都一樣

五、HTTP Code
參照:Hypermedia ControlsHypermedia Controlshttp://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
100 Continue
101 Switching
102 Processing
103-199 Unassigned
200 OK
201 Created
202 Accepted
203 Non-Authoritative Information
204 No Content
205 Reset Content
206 Partial Content
207 Multi-Status
208 Already Reported
209-225 Unassigned
226 IM Used
227-299 Unassigned
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
306 (Unused)
307 Temporary Redirect
308 Permanent Redirect
309-399 Unassigned
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Payload Too Large
414 URI Too Long
415 Unsupported Media Type
416 Range Not Satisfiable
417 Expectation Failed
418-420 Unassigned
421 Misdirected Request
422 Unprocessable Entity
423 Locked
424 Failed Dependency
425 Unassigned
426 Upgrade Required
427 Unassigned
428 Precondition Required
429 Too Many Requests
430 Unassigned
431 Request Header Fields Too Large
432-450 Unassigned
451 Unavailable For Legal Reasons
452-499 Unassigned
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
506 Variant Also Negotiates
507 Insufficient Storage
508 Loop Detected
509 Unassigned
510 Not Extended
511 Network Authentication Required
512-599 Unassigned

六、開發注意
對于一個基于HTTP的REST服務而言,軟件開發人員需要遵守如下的守則以保持API的后向兼容性(即兼容舊版本):

1、不能在請求中添加新的必須的參數。
2、不能更改操作資源的動詞。
3、不能更改響應的HTTP status。

七、性能優化
  接下來我們就來簡單地說說基于HTTP的REST服務中的性能問題。在基于HTTP的REST服務中,性能提升主要分為兩個方面:REST架構本身在提高性能方面做出的努力,以及基于HTTP協議的優化。

首先要討論的就是對登陸性能的優化。在前面我們已經介紹過,在一個基于HTTP的REST服務中,每次都將用戶的用戶名和密碼發送到服務端并由服務端驗證這些信息是否合法是一個非常消耗資源的流程。因此我們常常需要在登陸服務中使用一個緩存,或者是使用第三方單點登陸(SSO)類庫。

除此之外,軟件開發人員還可以通過為同一個資源提供不同的表現形式來減少在網絡上傳輸的數據量,從而提高REST服務的性能。

而在集群內部服務之間,我們則可以不再使用JSON,XML等這種用戶可以讀懂的負載格式,而是使用二進制格式。這樣可以大大地減少內部網絡所需要傳輸的數據量。這在內部網絡交換數據頻繁并且所傳輸的數據量巨大時較為有效。

接下來就是REST系統的橫向擴展。在REST的無狀態約束的支持下,我們可以很容易地向REST系統中添加一個新的服務器。

除了這些和REST架構本身相關的性能提升之外,我們還可以在如何更高效地使用HTTP協議上努力。一個最常見的方法就是使用條件請求(Conditional Request)。簡單地說,我們可以使用如下的HTTP頭來有條件地存取資源:

1、ETag:一個對用戶不透明的用來標示資源實例的哈希值
2、Data-Modified:資源被更改的時間
3、If-Modified-Since:根據資源的更改時間有條件地Get資源。這將允許客戶端對4、未更改的資源使用本地緩存。
5、If-None-Match:根據ETag的值有條件地Get資源。
6、If-Unmodified-Since:根據資源的更改時間有條件地Put或Delete資源。
7、If-Match:根據ETag的值有條件地Put或Delete資源。
  當然,這里所提到的一系列性能優化方案實際上僅僅是比較常見的,與基于HTTP的REST服務關聯較大的方案。只是顧慮到過多地陳述和REST關聯不大的話題一方面顯得比較沒有效率,另一方面也是因為通過寫另一個系列博客可以將問題陳述得更加清楚,因此在這里我們將不再繼續討論性能相關的話題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容

  • 一說到REST,我想大家的第一反應就是“啊,就是那種前后臺通信方式。”但是在要求詳細講述它所提出的各個約束,以及如...
    時待吾閱讀 3,444評論 0 19
  • REST是Roy Fielding博士在他的畢業論文中首先提出來的。Roy Fielding何許人也?他是HTTP...
    歌灣汐云閱讀 2,155評論 1 18
  • API定義規范 本規范設計基于如下使用場景: 請求頻率不是非常高:如果產品的使用周期內請求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,575評論 0 6
  • 轉自:http://www.runoob.com/w3cnote/restful-architecture.htm...
    艾爾溫閱讀 1,006評論 0 51
  • 好想去看電影,越虐越好,然后痛痛快快哭一下。 小時候惹媽媽生氣了,我會突然想哭,然后哭著哭著一直停不下來,哭到最后...
    早已氣定神閑閱讀 181評論 0 1