使用 JAX-RS/Jersey 绕过 JAX-WS SOAP 开销?
Bypassing JAX-WS SOAP overhead with JAX-RS/Jersey?
我集成或使用过的唯一 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 客户端似乎,乍一看,要复杂得多。如果我理解正确的话,大概的流程是这样的:
- 从服务提供商处获取名为
WSDL
的 XML 文档;这似乎是对所有可用端点的语言不可知的描述
- 运行 在
WSDL
上调用 wsimport
的 JDK 工具实际上生成 Java 源代码,它实现了 JAX-WS API 并实际表示我的 SOAP 客户端
- 将那些生成的源文件导入到我的项目中并使用它们
首先,如果我说的关于这个过程有什么不正确的地方,请首先纠正我!假设我或多或少是正确的,但我不明白的是:如果全部是 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 动词和 request/response 实体来发送特定于应用程序的消息的方法;这是一个 HTTP "conversation"。那么,为什么我不能将 Jersey 之类的 REST 框架劫持到 HTTP POST 消息,并在这样做时绕过此 SOAP 开销?
这会吸引基于意见的答案,但首先,您应该了解
我集成或使用过的唯一 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 客户端似乎,乍一看,要复杂得多。如果我理解正确的话,大概的流程是这样的:
- 从服务提供商处获取名为
WSDL
的 XML 文档;这似乎是对所有可用端点的语言不可知的描述 - 运行 在
WSDL
上调用wsimport
的 JDK 工具实际上生成 Java 源代码,它实现了 JAX-WS API 并实际表示我的 SOAP 客户端 - 将那些生成的源文件导入到我的项目中并使用它们
首先,如果我说的关于这个过程有什么不正确的地方,请首先纠正我!假设我或多或少是正确的,但我不明白的是:如果全部是 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 动词和 request/response 实体来发送特定于应用程序的消息的方法;这是一个 HTTP "conversation"。那么,为什么我不能将 Jersey 之类的 REST 框架劫持到 HTTP POST 消息,并在这样做时绕过此 SOAP 开销?
这会吸引基于意见的答案,但首先,您应该了解