03.08 webservice接口和restful接口哪個更好?

Goodboy82862206


REST是一種架構風格,其核心是面向資源,遵循CRUD原則,這個原則告訴我們對於資源只需要4種行為,分別是:創建,獲取,更新和刪除,並且這些資源執行的操作時通過HTTP協議規定的,而WebService底層是SOAP協議,核心是面向活動,有嚴格的規範和標準,包括安全,事務等方面。

那麼我們是使用RESTful還是WebService就需要考慮資源本身的 ,看資源本身是那種簡單的類似增刪改查的業務操作,還是那種比較複雜,如轉賬,事務處理等。其次是看是否有嚴格的規範和標準的,而且有多個業務系統集成和開發的時候,我們使用SOAP協議就比較優勢,如果是簡單的數據操作,無事務處理,開發和調用比較簡單的話使用REST架構風格比較有優勢,較為複雜的面向活動的服務,我們使用REST意義不大。


代碼接盤俠


我們在平時的開發項目中,有好多人問我們在設計底層服務的時候到底是應該選擇目前最流行的RestFul架構還是選擇老牌的webService呢?今天我就將這兩個概念做一下描述,看看到底什麼情況下選擇什麼比較合理。

  首先我們需要了解:REST是一種架構風格,其核心是面向資源;而webService底層SOAP協議,主要核心是面向活動;

  那麼什麼是SOAP,我想不用多說,百度一下滿眼都是。其實SOAP最早是針對RPC的一種解決方案,簡單對象訪問協議,很輕量,同時作為應用協議可以基於多種傳輸協議來傳遞消息(Http,SMTP等)。但是隨著SOAP作為WebService的廣泛應用,不斷地增加附加的內容,使得現在開發人員覺得SOAP很重,使用門檻很高。在SOAP後續的發展過程中,WS一系列協議的制定,增加了SOAP的成熟度,也給SOAP增加了負擔。  

  REST其實並不是什麼協議也不是什麼標準,而是將Http協議的設計初衷作了詮釋,在Http協議被廣泛利用的今天,越來越多的是將其作為傳輸協議,而非原先設計者所考慮的應用協議。SOAP類型的WebService就是最好的例子,SOAP消息完全就是將Http協議作為消息承載,以至於對於Http協議中的各種參數(例如編碼,錯誤碼等)都置之不顧。其實,最輕量級的應用協議就是Http協議。Http協議所抽象的get,post,put,delete就好比數據庫中最基本的增刪改查,而互聯網上的各種資源就好比數據庫中的記錄,對於各種資源的操作最後總是能抽象成為這四種基本操作,在定義了定位資源的規則以後,對於資源的操作通過標準的Http協議就可以實現,開發者也會受益於這種輕量級的協議。

  REST專門針對網絡應用設計和開發方式,以降低開發的複雜性,提高系統的可伸縮性。REST提出設計概念和準則為:

  1. 網絡上的所有事物都可以被抽象為資源(resource)

  2. 每一個資源都有唯一的資源標識(resource identifier),對資源的操作不會改變這些標識

  3. 所有的操作都是無狀態的

  REST簡化開發,其架構遵循CRUD原則,該原則告訴我們對於資源(包括網絡資源)只需要四種行為:創建,獲取,更新和刪除就可以完成相關的操作和處理。我們可以通過統一資源標識符(Universal Resource Identifier,URI)來識別和定位資源,並且針對這些資源而執行的操作是通過 HTTP 規範定義的。其核心操作只有GET,PUT,POST,DELETE。由於REST強制所有的操作都必須是stateless的,這就沒有上下文的約束,如果做分佈式,集群都不需要考慮上下文和會話保持的問題。極大的提高系統的可伸縮性。

  SOAP webService有嚴格的規範和標準,包括安全,事務等各個方面的內容,同時SOAP強調操作方法和操作對象的分離,有WSDL文件規範和XSD文件分別對其定義。

  如果從這個意義上講,是否使用REST就需要考慮資源本身的抽象和識別是否困難,如果本身就是簡單的類似增刪改查的業務操作,那麼抽象資源就比較容易,而對於複雜的業務活動抽象資源並不是一個簡單的事情。比如校驗用戶等級,轉賬,事務處理等,這些往往並不容易簡單的抽象為資源。

  其次如果有嚴格的規範和標準定義要求,而且前期規範標準需要指導多個業務系統集成和開發的時候,SOAP風格由於有清晰的規範標準定義是明顯有優勢的。我們可以在開始和實現之前就嚴格定義相關的接口方法和接口傳輸數據。(很多情況下是為了兼容以前項目且前臺調用邏輯代碼都不能動的前提下,更改底層應用,一般就需要使用webService模式開發,因為老代碼中已經有了明確的方法定義以及參數類型、個數等申明)

  簡單數據操作,無事務處理,開發和調用簡單這些是使用REST架構風格的優勢。而對於較為複雜的面向活動的服務,如果我們還是使用REST,很多時候都是仍然是傳統的面向活動的思想通過轉換工具再轉換得到REST服務,這種使用方式是沒有意義的。


囉嗦的老鄔


RESTful 風格的 webservice 越來越流行了, sun 也推出了 RESTful WebService 的官方規範: JAX-RS ,全稱:

Java API for RESTful WebService。該規範定義了一系列的註解

RESTful 簡化了 web service 的設計,它不再需要 wsdl ,也不再需要 soap 協議,而是通過最簡單的 http 協議傳輸數據 ( 包括 xml 或 json) 。既簡化了設計,也減少了網絡傳輸量(因為只傳輸代表數據的 xml 或 json ,沒有額外的 xml 包裝)。

下面為大家介紹使用 cxf 開發 RESTful WebService

Cxf2.7 實現了大部分的 jax -rs 規範,從 cxf3.0 開始實現 jax-rs 的全套規範

服務端

Spring3 +cxf 開發 RESTfulweb service

服務端 jar 包

上面的 jettison jar 包是用來將 jaxb 擴展為為 json 支持的 jar

實體類

com.tgb.cxf.server;import javax.xml.bind.annotation.XmlRootElement;//一定要使用XmlRootElement註解進行標註@XmlRootElement(name="user")public class User { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

WebService 接口

("/userservice/")public interface IMyService { @Path("/addUser/") @POST Response addUser(User user); @Path("/delUser/{id}/") @DELETE Response delUser(@PathParam("id") String id); @Path("/updateUser/") @PUT Response updateUser(User user); @Path("/getUserById/{id}/") @GET @Produces("application/json")//返回json數據格式 User getUserById(@PathParam("id") String id); @Path("/") @GET @Produces("application/json")//返回json數據格式 List<user> findAllUsers(); }/<user>

WebService 實現類

class MyServiceImpl implements IMyService { private HashMap<string> users = new HashMap<string>(); public MyServiceImpl(){ init(); } public Response addUser(User user) { users.put(user.getId(), user); System.out.println("添加用戶成功"); System.out.println(users.size()); System.out.println(users.get("2").getName()); return Response.ok().build(); } public Response delUser(String id) { users.remove(id); System.out.println(users.size()); return Response.ok().build(); } public Response updateUser(User user) { users.put(user.getId(), user); System.out.println(users.get("1").getName()); return Response.ok().build(); } public User getUserById(String id) { return users.get(id); } private void init(){ User user = new User(); user.setId("1"); user.setName("溫歡"); users.put(user.getId(), user); } public List<user> findAllUsers() { List<user> userlist = new ArrayList<user>(); userlist.add(users.get("1")); return userlist; } }/<user>/<user>/<user>/<string>/<string>

spring -cxf.xml配置文件

<beans> <bean> <server> <servicebeans> /<servicebeans> /<server> /<beans>

web.xml 文件配置

<web-app> <context-param> <param-name>contextConfigLocation/<param-name> <param-value>classpath:config/spring-cxf.xml/<param-value> /<context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener/<listener-class> /<listener> <servlet> <servlet-name>cxf/<servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet/<servlet-class> <load-on-startup>1/<load-on-startup> /<servlet> <servlet-mapping> <servlet-name>cxf/<servlet-name> <url-pattern>/services/*/<url-pattern> /<servlet-mapping> /<web-app>

客戶端

所需 jar 包

因為 RESTful 就是利用最原始的 http 協議傳輸數據,所以客戶端其實就是一個 http客戶端,有以下幾種實現方式

JAX-RS Client API --cxf3.0+

Proxy 【使用起來簡單,代理封裝通信細節】

Apache HttpClient

WebClient

為了簡單我使用了 Proxy 方式

代碼如下

class MyClient { /** @MethodName\t: main * @Description\t: JaxRs測試客戶端 * @param args */ public static void main(String[] args) { IMyService myService = JAXRSClientFactory.create("http://localhost:8096/cxf02/services/myservice\

Echa攻城獅


目前,Web Service主要有兩大流派:

  • 1、基於SOAP的Web Service : SOAP(簡單對象訪問協議)是一種基於XML的協議,用以訪問Web Service。其接口以機器可處理的格式進行描述,稱為WSDL(Web服務定義語言)文檔。通過使用標準的的XML文檔來描述Web Service,在XML文件中,會詳細記錄接口的信息,如消息的格式、傳輸協議以及交互的位置等信息。
  • 2、基於REST的Web Service :REST(Representational State Transfer)是一種軟件架構,它使用JSON來描述數據格式,最重要的是HTTP傳輸協議對REST來說是非必須的。

下面,通過一張表格來對比REST與SOAP之間的異同:

當然,目前流行的還是restful 風格的web服務,而且restful用json,應用調用效類更高!


程序君


大家好,首先呢,在這裡我非常榮幸可以有這個機會為你解答這個問題,這讓我感到十分開心,下面呢,讓我們一起了解一下這個問題,現在讓我們一起探討一下吧。

restful增刪改查 幾十年的東西了 ,他只適合傻瓜式的API接口,並不適合現在高定製型的客戶端業務

而webservice 是定製化的接口更適合於當前客戶端業務

簡單來說就是你的頁面需要定製功能,這時restful非常的蹩手蹩腳了

以上這些就是我對於這個問題的一些個人看法和見解,我最後在這裡,祝大家每天工作開開心心,生活快快樂樂,健康生活每一天,家和萬事興,年年發大財,生意興隆,謝謝!


科技嘿嘿


其實webservicr和restful都是基於http的接口調用,webdervice用xml,restful用json,傳輸效率來講,restful好點


風雲code


從實際應用的角度做一個說明,ws和rf都是分佈式遠程調用的規範和方法,rf更適合於內部系統節點之間的通信,而ws更適合於外部暴露的接口,比如用於互聯網對外公開的服務。


手機用戶54444147856


內部系統用web service 兼容性強,外部系統用restful效率高


分享到:


相關文章: