1. 程式人生 > >Web Service兩種釋出協議--SOAP和REST的區別

Web Service兩種釋出協議--SOAP和REST的區別

1、
SOAP是一種具體的通訊協議,REST是一種規範.   
2、
SOAP(Simple Object Access Protocol)簡單物件訪問協議,是基於HTTP的一種異構系統通訊的協議,說白了就是xml文件傳輸,之所以會有它,就是在於不同語言C,C++,JAVA等語言開發的系統進行通訊,是WebService就是基於SOAP協議的,確實是一種比較傳統的SOA解決方案。  
REST(Rerepresentational State Transfer)是外國一位博士提出的一種架構風格,從資源狀態轉換角度看待我們的資源(如此簡潔,明瞭),所以外國人是挺牛的,但也是基於SOAP協議進行通訊,這是他的論文:  
http://jpkc.fudan.edu.cn/picture/article/216/35/4b/22598d594e3d93239700ce79bce1/7ed3ec2a-03c2-49cb-8bf8-5a90ea42f523.pdf  
不是SOAP可以用cxf開發,SOAP只是一個協議標準,你還開發個啥?  
至於WebService開發框架也有很多,比較熱門的就cxf, axis, axis2等,具體到apache上一看便知,只是方便我們開發而已,用jdk一樣可以開發,只是它們對jdk進行一些封裝,跟我們省了事。  
3、
rest 是一種風格 restful Webservice 和 soap的區別在於表現形式不一樣,如果想深入瞭解 可以去開開 深入理解Webservice 這本書,restful Webservice 不只是可以用json 也可以用xml 更可以用html做訊息返回, rest 風格的Webservice 和傳統的soap 主要的表現在於 rest是將資源暴露 soap是暴露操作 ,入門可以看看 http://www.infoq.com/cn/articles/rest-introduction這個網址 cxf也提供restful風格的 Webservice的 具體的流程 其實和soap是一樣的 但是rest更方便 更輕,具體的說不上來 東西太多 需要你自己去看了  
4、
SOAP比較複雜,基於XML,有對應規範;REST利用HTTP請請求方式GET,POST,PUT約定事務操作。簡單的說,SOAP通過傳輸XML,XML定義了請求和響應的具體資料,要進行的操作等等;而REST則是另一種約定,比如請求/user/1001這個RUL,GET方式返回id為1001的user資訊,POST方式則是更新id為1001的user資訊,DELETE刪除等。  

5、
WebService的兩種方式SOAP和REST比較 (轉)  
  
由於第一次接觸WebService,對於很多概念不太理解,尤其是看到各個OpenAPI的不同提供方式時,更加疑惑。如google map api採用了AJAX方式,通過javascript提供API,而淘寶TOP則採用直接的HTTP+XML請求方式,最令我疑惑的是教材上講的WSDL,UDDI從沒有在這些API中出現過。現在知道了WebService原來有兩種方式,一是SOAP協議方式,在這種方式下需要WSDL,UDDI等,二是REST方式,這種方式根本不需要WSDL,UDDI等。而且REST方式現在看來是更加流行,更有前途的方式。   
       在SOA的基礎技術實現方式中WebService佔據了很重要的地位,通常我們提到WebService第一想法就是SOAP訊息在各種傳輸協議上互動。近幾年REST的思想伴隨著SOA逐漸被大家接受,同時各大網站不斷開放API提供給開發者,也激起了REST風格WebService的熱潮。   
       在收到新需求Email之前,我對REST的理解僅僅是通過半懂不懂的看了Fielding的REST博士論文,說實話當時也就是希望瞭解這麼一個新概念,對於其內部的思想只是很膚淺的瞭解了一下。   
       ASF的最新需求就是可能需要實現REST風格的WebService整合,因此不得不好好的去看看REST的真正思想含義以及當前各大網站的設計方式。後面所要表述的也是我這個初學者的一些看法和觀點,拋磚引玉,希望在我將REST融入到ASF之前能夠獲得更多的反饋和意見。   
  
SOAP   
       什麼是SOAP,我想不用多說,google一把滿眼都是。其實SOAP最早是針對RPC的一種解決方案,簡單物件訪問協議,很輕量,同時作為應用協議可以基於多種傳輸協議來傳遞訊息(Http,SMTP等)。但是隨著SOAP作為WebService的廣泛應用,不斷地增加附加的內容,使得現在開發人員覺得SOAP很重,使用門檻很高。在SOAP後續的發展過程中,WS-*一系列協議的制定,增加了SOAP的成熟度,也給SOAP增加了負擔。   
  
REST   
       REST其實並不是什麼協議也不是什麼標準,而是將Http協議的設計初衷作了詮釋,在Http協議被廣泛利用的今天,越來越多的是將其作為傳輸協議,而非原先設計者所考慮的應用協議。SOAP型別的WebService就是最好的例子,SOAP訊息完全就是將Http協議作為訊息承載,以至於對於Http協議中的各種引數(例如編碼,錯誤碼等)都置之不顧。其實,最輕量級的應用協議就是Http協議。Http協議所抽象的get,post,put,delete就好比資料庫中最基本的增刪改查,而網際網路上的各種資源就好比資料庫中的記錄(可能這麼比喻不是很好),對於各種資源的操作最後總是能抽象成為這四種基本操作,在定義了定位資源的規則以後,對於資源的操作通過標準的Http協議就可以實現,開發者也會受益於這種輕量級的協議。   
       自己理解的將REST的思想歸結以下有如下幾個關鍵點:   
         
1.面向資源的介面設計   
所有的介面設計都是針對資源來設計的,也就很類似於我們的面向物件和麵向過程的設計區別,只不過現在將網路上的操作實體都作為資源來看待,同時URI的設計也是體現了對於資源的定位設計。後面會提到有一些網站的API設計說是REST設計,其實是RPC-REST的混合體,並非是REST的思想。   
  
2.抽象操作為基礎的CRUD   
   這點很簡單,Http中的get,put,post,delete分別對應了read,update,create,delete四種操作,如果僅僅是作為對於資源的操作,抽象成為這四種已經足夠了,但是對於現在的一些複雜的業務服務介面設計,可能這樣的抽象未必能夠滿足。其實這也在後面的幾個網站的API設計中暴露了這樣的問題,如果要完全按照REST的思想來設計,那麼適用的環境將會有限制,而非放之四海皆準的。         
  
3.Http是應用協議而非傳輸協議   
   這點在後面各大網站的API分析中有很明顯的體現,其實有些網站已經走到了SOAP的老路上,說是REST的理念設計,其實是作了一套私有的SOAP協議,因此稱之為REST風格的自定義SOAP協議。   
  
4.無狀態,自包含   
這點其實不僅僅是對於REST來說的,作為介面設計都需要能夠做到這點,也是作為可擴充套件和高效性的最基本的保證,就算是使用SOAP的WebService也是一樣。   
  
REST vs SOAP   
成熟度:   
SOAP雖然發展到現在已經脫離了初衷,但是對於異構環境服務釋出和呼叫,以及廠商的支援都已經達到了較為成熟的情況。不同平臺,開發語言之間通過SOAP來互動的web service都能夠較好的互通(在部分複雜和特殊的引數和返回物件解析上,協議沒有作很細緻的規定,導致還是需要作部分修正)   
REST國外很多大網站都發布了自己的開發API,很多都提供了SOAP和REST兩種Web Service,根據調查部分網站的REST風格的使用情況要高於SOAP。但是由於REST只是一種基於Http協議實現資源操作的思想,因此各個網站的REST實現都自有一套,在後面會講訴各個大網站的REST API的風格。也正是因為這種各自實現的情況,在效能和可用性上會大大高於SOAP釋出的web service,但統一通用方面遠遠不及SOAP。由於這些大網站的SP往往專注於此網站的API開發,因此通用性要求不高。   
ASF上考慮釋出REST風格的Web Service,可以參考幾大網站的設計(兄弟公司的方案就是參考了類似於flickr的設計模式),但是由於沒有類似於SOAP的權威性協議作為規範,REST實現的各種協議僅僅只能算是私有協議,當然需要遵循REST的思想,但是這樣細節方面有太多沒有約束的地方。REST日後的發展所走向規範也會直接影響到這部分的設計是否能夠有很好的生命力。   
總的來說SOAP在成熟度上優於REST。   
  
效率和易用性:   
    SOAP協議對於訊息體和訊息頭都有定義,同時訊息頭的可擴充套件性為各種網際網路的標準提供了擴充套件的基礎,WS-*系列就是較為成功的規範。但是也由於SOAP由於各種需求不斷擴充其本身協議的內容,導致在SOAP處理方面的效能有所下降。同時在易用性方面以及學習成本上也有所增加。   
    REST被人們的重視,其實很大一方面也是因為其高效以及簡潔易用的特性。這種高效一方面源於其面向資源介面設計以及操作抽象簡化了開發者的不良設計,同時也最大限度的利用了Http最初的應用協議設計理念。同時,在我看來REST還有一個很吸引開發者的就是能夠很好的融合當前Web2.0的很多前端技術來提高開發效率。例如很多大型網站開放的REST風格的API都會有多種返回形式,除了傳統的xml作為資料承載,還有(JSON,RSS,ATOM)等形式,這對很多網站前端開發人員來說就能夠很好的mashup各種資源資訊。   
    因此在效率和易用性上來說,REST更勝一籌。   
  
安全性:   
    這點其實可以放入到成熟度中,不過在當前的網際網路應用和平臺開發設計過程中,安全已經被提到了很高的高度,特別是作為外部介面給第三方呼叫,安全性可能會高過業務邏輯本身。   
    SOAP在安全方面是通過使用XML-Security和XML-Signature兩個規範組成了WS-Security來實現安全控制的,當前已經得到了各個廠商的支援,.net ,php ,java 都已經對其有了很好的支援(雖然在一些細節上還是有不相容的問題,但是互通基本上是可以的)。   
    REST沒有任何規範對於安全方面作說明,同時現在開放REST風格API的網站主要分成兩種,一種是自定義了安全資訊封裝在訊息中(其實這和SOAP沒有什麼區別),另外一種就是靠硬體SSL來保障,但是這隻能夠保證點到點的安全,如果是需要多點傳輸的話SSL就無能為力了。安全這塊其實也是一個很大的問題,今年在BEA峰會上看到有演示採用SAML2實現的網站間SSO,其實是直接採用了XML-Security和XML-Signature,效率看起來也不是很高。未來REST規範化和通用化過程中的安全是否也會採用這兩種規範,是未知的,但是加入的越多,REST失去它高效性的優勢越多。   
  
應用設計與改造:   
    我們的系統要麼就是已經有了那些需要被髮布出去的服務,要麼就是剛剛設計好的服務,但是開發人員的傳統設計思想讓REST的形式被接受還需要一點時間。同時在資源型資料服務介面設計上來說按照REST的思想來設計相對來說要容易一些,而對於一些複雜的服務介面來說,可能強要去按照REST的風格來設計會有些牽強。這一點其實可以看看各大網站的介面就可以知道,很多網站還要傳入function的名稱作為引數,這就明顯已經違背了REST本身的設計思路。   
   而SOAP本身就是面向RPC來設計的,開發人員十分容易接受,所以不存在什麼適應的過程。   
  
總的來說,其實還是一個老觀念,適合的才是最好的   
   技術沒有好壞,只有是不是合適,一種好的技術和思想被誤用了,那麼就會得到反效果。REST和SOAP各自都有自己的優點,同時如果在一些場景下如果去改造REST,其實就會走向SOAP(例如安全)。   
   REST對於資源型服務介面來說很合適,同時特別適合對於效率要求很高,但是對於安全要求不高的場景。而SOAP的成熟性可以給需要提供給多開發語言的,對於安全性要求較高的介面設計帶來便利。所以我覺得純粹說什麼設計模式將會佔據主導地位沒有什麼意義,關鍵還是看應用場景。   
   同時很重要一點就是不要扭曲了REST現在很多網站都跟風去開發REST風格的介面,其實都是在學其形,不知其心,最後弄得不倫不類,效能上不去,安全又保證不了,徒有一個看似象摸象樣的皮囊。   
  
REST設計的幾種形式   
參看了幾個大型網站的REST風格的API設計,這裡做一下大致的說明:   
  
FaceBook:
    
請求訊息:   
       在URI設計上採取了類似於REST的風格。例如對於friends的獲取,就定義為friends.get,前面部分作為資源定義,後面是具體的操作,其他的API也是類似,資源+操作,因此就算使用http的get方法都可能作了update的操作,其實已經違背了REST的思想,但是說到,其實那麼複雜的業務介面設計下,要通過RUCD來抽象所有的介面基本是不實際的。在URI定義好以後,還有詳細的引數定義,包括型別以及是否必選。   
  
響應訊息:   
       有多種方式,XML,JSON。XML有XSD作為參考。有點類似於沒有Head的SOAP,只不過這裡將原來可以定義在WSDL中的XSD抽取出來了。   
  
Flickr:   
       請求訊息:   
       http://api.flickr.com/services/rest/?method=flickr.test.echo&name=value   
       這裡就可以很明顯看出它所定製的REST請求其實和RPC沒有什麼太大的區別。   
         
       訊息返回:   
正確處理返回   

相關推薦

Web Service釋出協議--SOAPREST區別

1、 SOAP是一種具體的通訊協議,REST是一種規範.    2、 SOAP(Simple Object Access Protocol)簡單物件訪問協議,是基於HTTP的一種異構系統通訊的協議,說白了就是xml文件傳輸,之所以會有它,就是在於不同語言C,C++,JAVA等語言開發的系統進行通訊,是WebS

Service啟動方式onstartServiceonbindService區別

我們都知道,Service啟動有兩種方法,一種是onbindService(繫結),一種是onstartService(啟動),那這兩者究竟有什麼不同呢? 閒話:今天是我第一次寫部落格,第一次就這樣獻給csdn了,我不是大神,只是一個剛工作的實習生,寫部落格只

WebService發布協議--SOAPREST區別

操作方法 通信 修改 發送 precision profile rec 上交 調查 HTTP是標準超文本傳輸協議。使用對參數進行編碼並將參數作為鍵值對傳遞,還使用關聯的請求語義。每個協議都包含一系列HTTP請求標頭及其他一些信息,定義客戶端向服務器請求哪些內容,服務器用一系

圖片引用的方式background-image區別

發現問題的地方: 在模擬百度首頁進行製作的時候,在百度的搜尋文字框中有一個小照相機,這個照相機是一個圖片的一部分,在滑鼠移動到這個地方的時候它自動換到圖片的下半部分進行變色,而這個圖片的引用就是使用的background-image引用的,但是使用im

1 疑惑處理 WebService的方式SoapRest比較 專案釋出DebugRelease版的區別

1 webservice response 和 return 的區別    WebService的兩種方式Soap和Rest比較 2 debug release 生成檔案的區別     專案釋出Debug和Release版的區別 3 iis 整合和經典 管道的區別 ht

JAVA開發Web Service框架介紹選擇

下面分別介紹一個這幾種Web Service框架的基本概念1、JWS是Java語言對WebService服務的一種實現,用來開發和釋出服務。而從服務本身的角度來看JWS服務是沒有語言界限的。但是Java語言為Java開發者提供便捷釋出和呼叫WebService服務的一種途徑。2、Axis2是Apac

WebService的方式SOAPREST比較

由於第一次接觸WebService,對於很多概念不太理解,尤其是看到各個OpenAPI的不同提供方式時,更加疑惑。如google map api採用了AJAX方式,通過javascript提供API,而淘寶TOP則採用直接的HTTP+XML請求方式,最令我疑惑的是教材上講的

Http協議中,主要常見的傳送資料到伺服器有哪方式,這方式的特點區別,以及其在Http協議中的位置

Get 和 Post 的區別兩點: 一、這兩者傳遞引數時所用的編碼不一定是一樣的。在 Tomcat 中似乎 Get 的編碼方式是根據頁面中指定的編碼方式,而 Post 則是一直使用同一種編碼方式,可在 Tomcat 的 server.xml 中配置。 二、使用 Get 的時候,引數會顯示在位址列上,而 Po

web前端js跨域的實現方式jsonpsrc

                $.ajax(        {            type:'get',            url : "http://192.168.120.77:8081/queryTopPageParams?callback=?",            dataType :

FTP檔案傳輸協議模式-主動模式被動模式

TCP/IP協議中,FTP標準命令TCP埠號為21,Port方式資料埠為20。FTP協議的任務是從一臺計算機將檔案傳送到另一臺計算機,它與這兩臺計算機所處的位置、聯接的方式、甚至是是否使用相同的作業系統無關。假設兩臺計算機通過ftp協議對話,並且能訪問Internet, 你可以用ftp命令來傳輸檔案。每種作

使用 HTTP 協議訪問網路的方式:HttpURLConnection HttpClient

安卓中進行基於HTTP協議的網路訪問 說明: HttpClient (apache開發) HttpURLConnection(google在釋出安卓時在Java基礎上修改得到的) 使用HC(HttpClient)/UC(HttpURLConnect

PHP 記憶體溢位錯誤解決,以及對 PHP 命令列Web訪問執行方式的理解

開發過程中,某個介面由於從資料庫讀取資料量過大,返回狀態為 200,但無響應資料,PHP錯誤日誌裡有如下資訊:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted。 很顯然這是記憶

SAMLOAuth2這SSO協議區別

[toc] # 簡介 SSO是單點登入的簡稱,常用的SSO的協議有兩種,分別是SAML和OAuth2。本文將會介紹兩種協議的不同之處,從而讓讀者對這兩種協議有更加深入的理解。 # SAML SAML的全稱是Security Assertion Markup Language, 是由OASIS制定的一套

關於CUDAAPI:Runtime API Driver API

ive uda ++ etime bsp con spa runt cuda CUDA 眼下有兩種不同的 API:Runtime API 和 Driver API,兩種 API 各有其適用的範圍。高級API(cuda_runtime.h)是一種C

JAVA開發Web Service框架介紹

需求 驚人的 總線 cast pri web服務 希望 uil blank 在講Web Service開發服務時,需要介紹一個目前開發Web Service的幾個框架,分別為Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,這是Java

Spark on yarn的模式 yarn-cluster yarn-client

然而 技術 負責 blog 作業 mage 申請 .com contain 從深層次的含義講,yarn-cluster和yarn-client模式的區別其實就是Application Master進程的區別,yarn-cluster模式下,driver運行在AM(Appli

SQL 關於apply的形式cross apply outer apply

插入數據 sele 我們 如果 href 新的 desc 得出 tro 轉載:http://www.cnblogs.com/Leo_wl/archive/2013/04/02/2997012.html apply有兩種形式: cross apply 和 out

java路徑寫法"/""\"

linu 分隔 環境 存在 平臺 配置文件 ava window 寫法 1.示例: String path="D:\\新建文件夾\\2.png"; File file=new File(path); System.out.println(file.exis

軟件開發中的人:實用主義發燒友

class 軟件 實用 最好 們的 優缺點 www. 知識 你是 不論你是使用主義者還是發燒友,能有知道每個人都有自己的優缺點,專註於自己的的長處就好,最怕的就是自己是一種人卻偏要和另一種人比,比如明明自己是個實用主義者,卻總想有發燒友那樣對代碼的激情和專註。 程序員

JS區分中英文字元的方法: 正則charCodeAt()方法

JS區分中英文字元的兩種方法: 正則和charCodeAt()方法。 正則無疑是最強大的判斷各種條件的方法, 最近也在研習它, 雖然枯燥, 但仍有樂趣. 用它來判斷一個雙位元組的中文字元也是輕而易舉地. 而判斷中文字元,  簡單且執行效率高. regExpForm.onblur=f