java - 使用 JAX-RS/Jersey 绕过 JAX-WS SOAP 开销?

标签 java web-services rest soap wsdl

我集成或使用过的唯一 Web 服务是 RESTful。我现在正在尝试与第 3 方 SOAP 服务集成,并对 SOAP 看似复杂的情况感到惊讶。

对于 REST,我使用名为 Jersey 的 JAX-RS 客户端这使得访问 RESTful 端点变得轻而易举。例如,如果服务在 http://api.example.com/fizz 公开 POST 端点(例如,用于更新插入 Fizz对象),然后在 Jersey 我可能会创建一个如下所示的服务客户端(伪代码):

// 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 开销呢?

最佳答案

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

  • 年轻得多( final draft in 2006 ,JAX-RS 在 2008-9 中出现)。

  • RESTful Web 服务标准对于许多用途来说都是相当不稳定的 - 许多企业更喜欢 WSDL 形式的契约(Contract)。

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

关于java - 使用 JAX-RS/Jersey 绕过 JAX-WS SOAP 开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927739/

相关文章:

java - 什么是 MyClass.class?

json - 在 REST 服务中使用 PATCH 和 RFC 6902 从数组中删除对象。你怎么知道你正在删除正确的元素?

java - Spring 没有捕获我休息请愿书的所有对象

mysql - Restful Web 服务中的搜索功能

java - eclipse 中的 "failed while installing axis2 core 1.1"?

java - 通过 Servlet 调用外部 Web 服务

java - 当我尝试用 java 自动登录 facebook 时,内部服务器错误 500

java - 任何人都知道通用事务 map |设置|列表

java - Groovy 中的 Spring MVC 注释 Controller

php - 如何获取给定城市的时间?