簡體   English   中英

通過JAX-RS / Jersey繞過JAX-WS SOAP開銷?

[英]Bypassing JAX-WS SOAP overhead with JAX-RS/Jersey?

我曾經與之集成或使用過的唯一Web服務是RESTful。 我現在正在嘗試與第三方SOAP服務集成,並對SOAP看起來似乎有些費解感到震驚。

在REST中,我使用了一個稱為Jersey的JAX-RS客戶端,該客戶端使RESTful端點的實現成為一個難題。 例如,如果某項服務在http://api.example.com/fizz公開了一個POST端點(例如,用於提升Fizz對象),那么在澤西島,我可能會制作一個如下所示的服務客戶端(偽代碼) :

// Groovy pseudo-code
class Fizz {
    int type
    boolean derps
    String uid
}

class FizzClient {
    WebResource webResource = initAt("https://api.example.com")

    upsertFizz(Fizz fizz) {
        webResource.path("fizz").post(fizz)
    }
}

但是基於Java的SOAP客戶端乍一看似乎要復雜得多。 如果我正確理解安裝程序,則一般過程如下:

  1. 從服務提供者那里獲取一個稱為WSDL的XML文檔; 這似乎是所有可用端點的語言不可知的描述
  2. WSDL上運行一個名為wsimport的JDK工具,該工具實際上會生成Java源代碼,該代碼實現JAX-WS API,並且實際上代表了我的SOAP客戶端
  3. 將那些生成的源文件導入到我的項目中並使用它們

首先,如果我對這個過程所說的話不正確,請先糾正我! 假設我或多或少是正確的,我不明白的是: 如果這全部是HTTP對話,為什么需要這樣做 為什么我不能與Jersey進行基於SOAP的對話,而繞開所​​有這些源代碼生成樣板?

例如,假設存在相同的端點,但是由SOAP來控制:

class FizzClient {
    WebResource webResource = initAt("https://api.example.com")
    FizzSerializer serializer // I take Fizz instances and turn them into XML
    FizzDeserializer deserializer // I take XML and turn them into Fizz instances

    upsertFizz(Fizz fizz) {
        String xmlFizz = serializer.serialize(fizz)
        webResource.path("fizz").post(xmlFizz)
    }
}

如果我正確理解SOAP,那只是利用HTTP動詞和請求/響應實體來發送特定於應用程序的消息的一種方式。 這是一個HTTP“對話”。 那么,為什么我不能將諸如Jersey的REST框架劫持到HTTP POST消息中,而繞過此SOAP開銷呢?

這將吸引基於意見的答案,但是首先,您應該了解

  • 小得多( 於2006年發布最終草案 ,JAX-RS於2008-9年問世)。

  • 出於許多目的,RESTful Web服務標准是完全不穩定的-許多企業更喜歡以WSDL形式簽訂合同。

  • 更不用說JAX-WS與WS-I一起提供了許多其他標准,這些標准管理企業關心的安全性,消息可靠性和其他企業用品(在通用的“ WS- *”旗幟下)。 有各種各樣的庫正在嘗試將這種統一性引入平台,但是就目前而言, / WS-I是行業標准

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM