色色一区二区三区,一本大道道久久九九AV综合,国产香蕉97碰碰视频va碰碰看,综合亚洲国产2020

    <legend id="mljv4"><u id="mljv4"><blockquote id="mljv4"></blockquote></u></legend>

    <sub id="mljv4"><ol id="mljv4"><abbr id="mljv4"></abbr></ol></sub>
      <mark id="mljv4"></mark>
      人文藝術(shù) > webservice接口和restful接口哪個更好?

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

      2020-10-13 09:05閱讀(63)

      webservice接口和restful接口哪個更好?:我們在平時的開發(fā)項(xiàng)目中,有好多人問我們在設(shè)計(jì)底層服務(wù)的時候到底是應(yīng)該選擇目前最流行的RestFul架構(gòu)還是選擇老牌的we:

      1

      我們在平時的開發(fā)項(xiàng)目中,有好多人問我們在設(shè)計(jì)底層服務(wù)的時候到底是應(yīng)該選擇目前最流行的RestFul架構(gòu)還是選擇老牌的webService呢?今天我就將這兩個概念做一下描述,看看到底什么情況下選擇什么比較合理。

        首先我們需要了解:REST是一種架構(gòu)風(fēng)格,其核心是面向資源;而webService底層SOAP協(xié)議,主要核心是面向活動;

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

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

        REST專門針對網(wǎng)絡(luò)應(yīng)用設(shè)計(jì)和開發(fā)方式,以降低開發(fā)的復(fù)雜性,提高系統(tǒng)的可伸縮性。REST提出設(shè)計(jì)概念和準(zhǔn)則為:

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

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

        3. 所有的操作都是無狀態(tài)的

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

        SOAP webService有嚴(yán)格的規(guī)范和標(biāo)準(zhǔn),包括安全,事務(wù)等各個方面的內(nèi)容,同時SOAP強(qiáng)調(diào)操作方法和操作對象的分離,有WSDL文件規(guī)范和XSD文件分別對其定義。

        如果從這個意義上講,是否使用REST就需要考慮資源本身的抽象和識別是否困難,如果本身就是簡單的類似增刪改查的業(yè)務(wù)操作,那么抽象資源就比較容易,而對于復(fù)雜的業(yè)務(wù)活動抽象資源并不是一個簡單的事情。比如校驗(yàn)用戶等級,轉(zhuǎn)賬,事務(wù)處理等,這些往往并不容易簡單的抽象為資源。

        其次如果有嚴(yán)格的規(guī)范和標(biāo)準(zhǔn)定義要求,而且前期規(guī)范標(biāo)準(zhǔn)需要指導(dǎo)多個業(yè)務(wù)系統(tǒng)集成和開發(fā)的時候,SOAP風(fēng)格由于有清晰的規(guī)范標(biāo)準(zhǔn)定義是明顯有優(yōu)勢的。我們可以在開始和實(shí)現(xiàn)之前就嚴(yán)格定義相關(guān)的接口方法和接口傳輸數(shù)據(jù)。(很多情況下是為了兼容以前項(xiàng)目且前臺調(diào)用邏輯代碼都不能動的前提下,更改底層應(yīng)用,一般就需要使用webService模式開發(fā),因?yàn)槔洗a中已經(jīng)有了明確的方法定義以及參數(shù)類型、個數(shù)等申明)

        簡單數(shù)據(jù)操作,無事務(wù)處理,開發(fā)和調(diào)用簡單這些是使用REST架構(gòu)風(fēng)格的優(yōu)勢。而對于較為復(fù)雜的面向活動的服務(wù),如果我們還是使用REST,很多時候都是仍然是傳統(tǒng)的面向活動的思想通過轉(zhuǎn)換工具再轉(zhuǎn)換得到REST服務(wù),這種使用方式是沒有意義的。

      2

      REST是一種架構(gòu)風(fēng)格,其核心是面向資源,遵循CRUD原則,這個原則告訴我們對于資源只需要4種行為,分別是:創(chuàng)建,獲取,更新和刪除,并且這些資源執(zhí)行的操作時通過HTTP協(xié)議規(guī)定的,而WebService底層是SOAP協(xié)議,核心是面向活動,有嚴(yán)格的規(guī)范和標(biāo)準(zhǔn),包括安全,事務(wù)等方面。

      那么我們是使用RESTful還是WebService就需要考慮資源本身的 ,看資源本身是那種簡單的類似增刪改查的業(yè)務(wù)操作,還是那種比較復(fù)雜,如轉(zhuǎn)賬,事務(wù)處理等。其次是看是否有嚴(yán)格的規(guī)范和標(biāo)準(zhǔn)的,而且有多個業(yè)務(wù)系統(tǒng)集成和開發(fā)的時候,我們使用SOAP協(xié)議就比較優(yōu)勢,如果是簡單的數(shù)據(jù)操作,無事務(wù)處理,開發(fā)和調(diào)用比較簡單的話使用REST架構(gòu)風(fēng)格比較有優(yōu)勢,較為復(fù)雜的面向活動的服務(wù),我們使用REST意義不大。

      3

      RESTful 風(fēng)格的 webservice 越來越流行了, sun 也推出了 RESTful WebService 的官方規(guī)范: JAX-RS ,全稱:

      Java API for RESTful WebService。該規(guī)范定義了一系列的注解

      RESTful 簡化了 web service 的設(shè)計(jì),它不再需要 wsdl ,也不再需要 soap 協(xié)議,而是通過最簡單的 http 協(xié)議傳輸數(shù)據(jù) ( 包括 xml 或 json) 。既簡化了設(shè)計(jì),也減少了網(wǎng)絡(luò)傳輸量(因?yàn)橹粋鬏敶頂?shù)據(jù)的 xml 或 json ,沒有額外的 xml 包裝)。

      下面為大家介紹使用 cxf 開發(fā) RESTful WebService

      Cxf2.7 實(shí)現(xiàn)了大部分的 jax -rs 規(guī)范,從 cxf3.0 開始實(shí)現(xiàn) jax-rs 的全套規(guī)范

      服務(wù)端

      Spring3 +cxf 開發(fā) RESTfulweb service

      服務(wù)端 jar 包

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

      實(shí)體類

      com.tgb.cxf.server;import javax.xml.bind.annotation.XmlRootElement;//一定要使用XmlRootElement注解進(jìn)行標(biāo)注@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數(shù)據(jù)格式 User getUserById(@PathParam(\"id\") String id); @Path(\"/\") @GET @Produces(\"application/json\")//返回json數(shù)據(jù)格式 List<User> findAllUsers(); }

      WebService 實(shí)現(xiàn)類

      class MyServiceImpl implements IMyService { private HashMap<String, User> users = new HashMap<String,User>(); 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; } }

      spring -cxf.xml配置文件

      <beans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:jaxrs=\"http://cxf.apache.org/jaxrs\" xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd\"> <!-- 注意這里的jaxrs命名空間需要大家手動添加 --> <!-- 發(fā)布webservice --> <bean id=\"serviceBean\" class=\"com.tgb.cxf.server.MyServiceImpl\"/> <jaxrs:server id=\"userService\" address=\"/myservice\"> <jaxrs:serviceBeans> <ref bean=\"serviceBean\"/> </jaxrs:serviceBeans> </jaxrs:server> </beans>

      web.xml 文件配置

      <web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:web=\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\" id=\"WebApp_ID\" version=\"3.0\"> <!-- 配置spring --> <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> <!-- 配置cxf servlet --> <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 包

      因?yàn)?RESTful 就是利用最原始的 http 協(xié)議傳輸數(shù)據(jù),所以客戶端其實(shí)就是一個 http客戶端,有以下幾種實(shí)現(xiàn)方式

      JAX-RS Client API --cxf3.0+

      Proxy 【使用起來簡單,代理封裝通信細(xì)節(jié)】

      Apache HttpClient

      WebClient

      為了簡單我使用了 Proxy 方式

      代碼如下

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

      4

      內(nèi)部系統(tǒng)用web service 兼容性強(qiáng),外部系統(tǒng)用restful效率高

      5

      其實(shí)webservicr和restful都是基于http的接口調(diào)用,webdervice用xml,restful用json,傳輸效率來講,restful好點(diǎn)

      6

      RESTful 是一種接口API,web service 不是接口,它是一種服務(wù)。兩個概念不應(yīng)該相提并論。

      實(shí)踐中,REST 和 SOAP 是 web services 中兩個比較常見的接口 API。有時候,JSON 也被看成是其中的另外一個接口。

      因此,一般人會問:作為 web services 的兩個接口技術(shù),REST 與 SOAP 那個更具有優(yōu)勢?

      答案:

      隨著數(shù)據(jù)科學(xué)和人工智能的發(fā)展,尤其是訪問不同數(shù)據(jù)源的需要,RESTful 接口更加強(qiáng)大和流行。目前看,所有數(shù)據(jù)庫都支持 REST API。當(dāng)然,許多企業(yè)仍然使用比較傳統(tǒng)的 SOAP API,因?yàn)樗麄兿嘈胚@個接口更加安全。

      事實(shí)上,不存在 SOAP 比 REST 更加安全的判斷,或者認(rèn)為 REST 不安全的顧慮是不必要的,也是不存在的。

      本質(zhì)上,信息技術(shù)安全是另外一方面的技術(shù)。兩個接口對安全都有相應(yīng)的處理機(jī)制,都安全。相對而言,除效率高外,RESTful API 更加安全。

      可以看看這個博文:

      https://raygun.com/blog/soap-vs-rest-vs-json/

      關(guān)于REST安全,可以看看下面博文:

      https://www.netsparker.com/blog/web-security/rest-api-web-service-security/

      熱點(diǎn)關(guān)注

      華裔女賭王就此沒落,生前讓所有 濃情端午粽飄香,青浦邀你“云體 上海:“云端”展現(xiàn)端午節(jié)文化內(nèi) “甜咸大戰(zhàn)”!明星藝人們喜歡什 如何做一個男人喜歡的情人(如何 當(dāng)你和你同時出現(xiàn)在同一個場景中 如何在昏暗的光線下設(shè)置快門速度 教育在生活中的價(jià)值是什么? 世上做壞事的人死后會面臨什么因 拜登就任總統(tǒng)后的第一步是什么? 同意/不同意:人生最重要的目標(biāo) 二戰(zhàn)后,德國在調(diào)和分歧方面做得 亞伯·林肯恨白人嗎? 一個編輯能把你的故事毀得有多嚴(yán) 現(xiàn)在的iPhone6還能堅(jiān)持再用一年 曹操為什么不殺司馬懿? 現(xiàn)在買房是不是最便宜的時候,現(xiàn) 我身邊的農(nóng)業(yè)銀行營業(yè)廳關(guān)了,AT 歐洲媒體評選CBA最有實(shí)力球員, 榮耀play的6+128和榮耀8X的6+128 螞蟻集團(tuán)是科技公司還是金融公司 請問機(jī)友華為mate30P與華為mate3 聽說老詹修剪一次指甲需要5小時 為什么說寶寶“一月睡二月哭三月 戴笠人稱戴老板,這個是怎么叫出 沒有工作能一次性補(bǔ)繳社保么? 我想知道定向師范生和免費(fèi)師范生 肺癌引起的咳嗽是怎樣的呢? 5000mAh電池的5G手機(jī)推薦嗎?要 恒大亞冠表現(xiàn)“差強(qiáng)人意”,你覺