第三篇:RESTful介紹

来源:http://www.cnblogs.com/MarsCheng/archive/2017/07/25/7234399.html
-Advertisement-
Play Games

在介紹restful之前先放一張從之前文章評論里看到的圖,我覺得它把soap和rest之間的一些區別形容地非常形象。 在第一篇和第二篇中我們也介紹過,soap協議傳遞的報文要基於xml格式的soap消息,它定義了非常複雜的xml schemas,因此會讓傳遞的消息變得非常重,而rest是充分利用了h ...


在介紹restful之前先放一張從之前文章評論里看到的圖,我覺得它把soap和rest之間的一些區別形容地非常形象。

在第一篇和第二篇中我們也介紹過,soap協議傳遞的報文要基於xml格式的soap消息,它定義了非常複雜的xml schemas,因此會讓傳遞的消息變得非常重,而rest是充分利用了http協議本身語義,所以會比較輕量。那麼除了這些,rest和我們常用的soap協議又有那些區別呢?rest為什麼會被看成是未來webservice的發展趨勢?下麵就讓我們具體來看看什麼是rest,什麼是restful webservcie。

1.概述REST和RESTful

REST全稱是Representational State Transfer,中文意思是表徵性狀態轉移。 它首次出現在2000年Roy Fielding的博士論文中,Roy Fielding是HTTP規範的主要編寫者之一。 他在論文中提到:"我這篇文章的寫作目的,就是想在符合架構原理的前提下,理解和評估以網路為基礎的應用軟體的架構設計,得到一個功能強、性能好、適宜通信的架構。REST指的是一組架構約束條件和原則。" 如果一個架構符合REST的約束條件和原則,我們就稱它為RESTful架構。
REST本身並沒有創造新的技術、組件或服務,而隱藏在RESTful背後的理念就是使用Web的現有特征和能力, 更好地使用現有Web標準中的一些準則和約束。雖然REST本身受Web技術的影響很深, 但是理論上REST架構風格並不是綁定在HTTP上,只不過目前HTTP是唯一與REST相關的實例。

是不是被上面一段話整的雲里霧裡?其實用人話來總結就是:

  • REST是一種風格是用URL定位資源,用HTTP動詞(GET,POST,DELETE,PUT,PATCH )描述操作的協議
  • RESTful實現REST風格的一種軟體架構風格,提供了設計原則和約束條件

2.理解REST

2.1 資源

REST全稱是表徵性狀態轉移,表徵指的就是資源。任何事物,只要有被引用到的必要,它就是一個資源。資源可以是實體(例如手機號碼),也可以只是一個抽象概念(例如價值) 。下麵是一些資源的例子:

  • 某用戶的手機號碼
  • 某用戶的個人信息
  • 最多用戶訂購的GPRS套餐
  • 兩個產品之間的依賴關係
  • 某用戶可以辦理的優惠套餐
  • 某手機號碼的潛在價值

2.1.1資源的標識

要讓一個資源可以被識別,需要有個唯一標識,在Web中這個唯一標識就是URI(Uniform Resource Identifier)。
URI既可以看成是資源的地址,也可以看成是資源的名稱。如果某些信息沒有使用URI來表示,那它就不能算是一個資源, 只能算是資源的一些信息而已。URI的設計應該遵循可定址性原則,具有自描述性,需要在形式上給人以直覺上的關聯。這裡以github網站為例,給出一些還算不錯的URI:

2.1.2 統一資源介面

RESTful架構應該遵循統一介面原則,統一介面包含了一組受限的預定義的操作,不論什麼樣的資源,都是通過使用相同的介面進行資源的訪問。介面應該使用標準的HTTP方法如GET,PUT和POST,並遵循這些方法的語義。
如果按照HTTP方法的語義來暴露資源,那麼介面將會擁有安全性和冪等性的特性,例如

  • GET和HEAD請求都是安全的,無論請求多少次,都不會改變伺服器狀態。
  • GET、HEAD、PUT和DELETE請求都是冪等的,無論對資源操作多少次,結果總是一樣的,後面的請求並不會產生比第一次更多的影響。
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:刪除某個指定動物園的指定動物

REST的發明者Roy Fielding博士曾經說過“Hypermedia作為應用引擎”是REST的前提, 這不是一個可選項,如果沒有Hypermedia,那就不是REST。(摘自Infoq對Fielding博士的第二段訪談)

因此除了符合HTTP協議自身的語義,REST還要滿足Hypermedia(超媒體即應用狀態引擎(hypermedia as the engine of application state))。

採用Hypermedia的API在響應(response)中除了返回資源(resource)本身外,還會額外返回一組鏈接(link)。 這組鏈接描述了對於該資源,消費者(consumer)接下來可以做什麼以及怎麼做。

這樣做的好處是:

1. 不再揣測如何組合使用API
2. 不用再考慮API的版本
3. 徹底與API的內部實現解耦

在這裡分享一篇詳細介紹Hypermedia的文章,寫得很好,有興趣的同學可以點進去瞭解下。

http://hippoom.github.io/blogs/value-of-hypermedia-from-client-perspective.html

2.1.3資源的表述

客戶端通過HTTP可以獲取資源,這個資源一般只是資源的表述。 例如文本資源可以採用html、xml、json等格式,圖片可以使用PNG或JPG展現出來

2.2 無狀態

“會話”狀態不是作為資源狀態保存在服務端的,而是被客戶端作為應用狀態進行跟蹤的。即RESTful 服務是無狀態的並且不會為任何客戶端保持狀態。一個請求不應該依賴過去的請求,服務對待每個請求都是獨立的。客戶端應用狀態在服務端提供的超鏈接的指引下發生變遷。服務端通過超鏈接告訴客戶端當前狀態有哪些後續狀態可以進入。

舉個慄子,假設我們在閱讀一篇需要翻頁的文章,我們如果要訪問下一頁。

有狀態的請求就需要記錄我們上一次請求的頁數PageNo,然後根據PageNo請求下一頁

有狀態設計:
Request1: GET http://MyService/Page/1
Request2: GET http://MyService/NextPage 

Request2的請求是要基於Request1請求的頁數來進行的,伺服器需要記住這個頁數,否則Request2無法進行。即Request2需要依賴Request1操作,如果Request1操作不成功,則Request2也不會成功。

而無狀態設計中每一步都是獨立,我們請求任何一頁都不需要知道上一次請求的是哪一頁。

無狀態設計像這樣:
Request1: GET http://MyService/Page/1
Request2: GET http://MyService/Page/2
每個請求都能被單獨對待。

無狀態服務更容易設計成集群,更容易維護,更容易伸縮。這樣的服務提供了更好的響應時間,因為它們能容易進行負載均衡。隨著微服務的概念越來越普及,無狀態設計勢必會成為未來的趨勢。

綜上,我們總結下REST的要求:

  1. 客戶端和伺服器結構 通信只能由客戶端單方面發起,表現為請求-響應的形式。
  2. 連接協議具有無狀態性
    通信的會話狀態(Session State)應該全部由客戶端負責維護。
  3. 能夠利用Cache(緩存)機制增進性能
    伺服器返回信息必須被標記是否可以緩存,如果緩存,客戶端可能會重用之前的信息發送請求。
  4. 統一介面(Uniform Interface)
  5. 層次化的系統
    系統組件不需要知道與他交流組件之外的事情。封裝服務,引入中間層。
  6. 按需代碼(Code-On-Demand ) - Javascript (可選)
    泛指任何按照客戶端軟體(例如,瀏覽器)的請求,將可執行的軟體程式從伺服器電腦發送到客戶端的技術。

3.怎麼評價REST

3.1 REST優勢

  • 輕量,直接基於http,不在需要任何別的諸如消息協議。get/post/put/delete為CRUD(增刪改查)操作,充分利用 HTTP 協議本身語義。
  • 客戶-伺服器(Client-Server)客戶端伺服器分離,提高用戶界面的便攜性(操作簡單),通過簡化伺服器提高可伸縮性(高性能,低成本),允許組件分別優化(可以讓服務端和客戶端分別進行改進和優化)
  • 無狀態(Stateless),從客戶端的每個請求要包含伺服器所需要的所有信息。
    • 提高可見性(可以單獨考慮每個請求)
    • 提高了可靠性(更容易從局部故障中修複)
    • 提高可擴展性(降低了伺服器資源使用)
  • HTTP 本身提供了豐富的內容協商手段,無論是緩存,還是資源修改的樂觀併發控制,都可以以業務無關的中間件來實現,限制了系統的複雜性,提高了可擴展性。

3.2 RESR缺點

  • restful首先是要求必須把所有的應用定義成為“resource”,然後只能針對資源做有限的四種操作(即增刪改查)。有許多現實中需要的API無法融入到restful所定義的規範中,比如user login / resetpassword等。雖然可以把login / password等也納入為某種資源,然後進行增刪改查。但這是在解決一些原本不存在不需要解決的問題,純屬浪費。 restful API僅適用與業務非常簡單的場景,比方說,就是為了提供少量數據表單的增刪改查。而這種場景實在是太過簡單,實際中幾乎找不到。所有的介面,伺服器端原本就存在有相應的函數,它們本來就有自身的命名空間,接受的參數、返回值、異常等等。
    採用輕便的方式暴露出來即可。無需把一堆函數重新歸納到“資源”,再削減腦袋把所有的操作都映射為“增刪改查”。
  • 開發效率低【不適應於自動化處理】
  • 運行效率低【需要比較複雜的字元串匹配模式】
  • 環境適應性差【不適應參數複雜的情況】

4.RESTful的應用

  • 亞馬遜提供rest風格的介面查找圖書
  • 雅虎提供的Web Service也是REST風格的

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載:http://blog.csdn.net/inter_peng/article/details/41021727 1. Action/Service/DAO簡介: Action是管理業務(Service)調度和管理跳轉的。 Service是管理具體的功能的。 Action只負責管理,而Serv ...
  • 浮點數是電腦中儲存實數的形式。我們時常需要用浮點數去處理帶小數點的運算。可你是否知道,浮點數還有這些操作: 正負無窮大 與整數不同,浮點數沒有溢出的概念。當浮點數的運算結果超過一定範圍時,它的值就會根據運算結果的符號變成正無窮大或負無窮大。最簡單產生無窮大的運算就是除以0.例如1.0/0.0的結果 ...
  • 在學習python的時候,三大“名器”對沒有其他語言編程經驗的人來說,應該算是一個小難點,本次博客就博主自己對裝飾器、迭代器和生成器理解進行解釋。 為什麼要使用裝飾器 什麼是裝飾器?“裝飾”從字面意思來誰就是對特定的建築物內按照一定的思路和風格進行美化的一種行為,所謂“器”就是工具,對於python ...
  • 實現介面自動化持續集成操作,具體操作步驟如下: windows - jenkins簡單安裝配置: 1. 下載最新版本的jenkins,jenkins官網地址:http://Jenkins-ci.org/ 2. 運行jenkins,找到jenkins.war所在目錄,執行命令:java -jar je ...
  • 在我們的日常項目開發過程中緩存是無處不在的,因為它可以極大的提高系統的訪問速度,關於緩存的框架也種類繁多,今天主要介紹的是使用現在非常流行的NoSQL資料庫(Redis)來實現我們的緩存需求。 ...
  • C#中double和float類型有兩個特殊值: Infinity(無窮大):5.0 / 0.0 = Infinity NaN(not a number):0.0 / 0.0 = NaN 計算表達式 0.0 / 0.0 = NaN, NaN和Infinity可以在表達式中使用: 10 + Infin ...
  • 閱讀目錄 前言 成熟的解決方案 剖析 實戰 服務治理的擴展 一、前言 首先本文僅作為筆者在做一些調研之後的總結,僅提供思路,不提供源碼,所以如果是想直接衝著源碼來的,可以跳過此文。如果後續有機會將項目開源出來,會第一時間寫新文章講解實線細節。 在分散式系統的構建之中,服務治理是類似血液一樣的存在,一 ...
  • 設計模式(0)簡單工廠模式 設計模式(1)單例模式(Singleton) 設計模式(2)工廠方法模式(Factory Method) 源碼地址 0 抽象工廠模式簡介 0.0 抽象工廠模式定義 抽象工廠模式一般的書面定義為:提供一個創建一系列相關或相互依賴對象的介面,而無需指定他們具體的類 提供創建接 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...