【问题标题】:Bypassing JAX-WS SOAP overhead with JAX-RS/Jersey?使用 JAX-RS/Jersey 绕过 JAX-WS SOAP 开销?
【发布时间】:2015-04-28 19:01:33
【问题描述】:

我曾经集成或使用过的唯一 Web 服务是 RESTful。我现在正在尝试与第 3 方 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 开销?

【问题讨论】:

  • 感谢@UtteshKumar (+1) - 但是我原则上理解 SOAP 和 REST 之间的区别。我想我只是指出 Jersey 可用于使用任何 HTTP 动词将任何类型的实体(作为任何类型的内容)发送到任何 URL……所以为什么(ever?)如果可以用 REST/Jersey 模拟,使用 JAX-WS/SOAP?

标签: java web-services rest soap wsdl


【解决方案1】:

这将吸引基于意见的答案,但首先,您应该了解

  • 更年轻( 有一个final draft in 2006,JAX-RS 出现在2008-9)。

  • RESTful Web 服务标准,对于许多目的来说是非常无定形的 - 许多企业更喜欢 WSDL 形式的合同的舒适性。

  • 更不用说 JAX-WS 与 WS-I 一起提供了许多其他标准来管理企业关心的安全性、消息可靠性和其他企业好东西(在通用的“WS-*”旗帜下) .有很多库试图在 平台上实现这种统一性,但目前,/WS-I 是行业标准

【讨论】:

  • 谢谢@kolossus (+1) - 但你是说我不能强迫泽西岛尊重 SOAP 的客户端,或者只是说我 不应该?再次感谢!
  • You can @smeeb,它只是没有内置在平台中(至少,我不知道)
猜你喜欢
  • 1970-01-01
  • 2011-06-29
  • 2011-12-16
  • 1970-01-01
  • 2013-03-15
  • 2013-10-18
  • 2011-09-09
  • 2014-01-24
  • 2016-12-02
相关资源
最近更新 更多