Soap 网络服务请求与 HTTP POST 请求?

Soap webservice request vs HTTP POST request?

我来自 servlet/web 应用程序世界并开始学习 Web 服务(基于 SOAP)。我经历了一些网络服务 教程。我试图在普通 http 请求和 webservice 请求之间画出相似之处。这是我的观察;-

1)都是HTTP请求。 Webservice 也是一个 post 请求,其中包含 soap 信封作为请求正文。香皂信封 只是一个包含数据

的普通 xml

2)java 存根内部编组 XML ,创建 HTTP 请求并将其发送给消费者

3) 消费者端的 Servlet 拦截该请求并将其解压缩到 java 对象并将其发送到相应的服务。

我的观察是否正确?我知道可能还有其他复杂性,但我试图以简单的方式进行比较。

我认为您可以在 Ben Klopfer 的 blog post 中找到很好的回应。

XML/SOAP与HTTP/REST的主要区别在于前者的响应最冗长,而后者则较轻。

但这不是您必须考虑的唯一方面。 REST 表示资源的状态,更易于使用和理解,请始终记住,与 SOAP 相比,REST 是后出现的。 此外 SOAP 不限于使用 HTTP/HTTPS,还可以与其他传输如 SMTP、JMS 等一起使用

恢复 post 提醒您:

Use SOAP when:

  • All you need is simple operations, like read only methods

  • Implementing a one-way or one-object service for something like data exchange or transfer

  • You want finer control over the specific transport of data, or can’t always use HTTP

  • Rigid specifications need to be enforced on incoming requests, and you want to minimize additional documentation needed for use

  • You can rely on client ability to parse XML, or more preferably SOAP itself

  • You need built-in error handling when things go wrong with requests

Use REST when:

  • Operations are complex, like create/read/update/delete on objects

  • Implementing a multi-faceted service for a variety of different objects

  • You want to easily and quickly target a variety of consumer end user devices as clients

  • Requests are generally stateless, like call and response compared to a conversation

  • Your clients may have limited bandwidth or processing power

  • You can leave it up to the client to get their requests correct and to deal with problems

您的假设大体上是正确的。然而,微妙之处会导致巨大的差异。

Claim 1 : both are HTTP.

SOAP 通常与 HTTP "binding" 一起使用。然而,它不必是那样的。 SOAP 被设计为与传输完全无关。在 JMS 上使用 SOAP 并不少见(尽管有人可能认为这是对 JMS 的过度使用,是一种过度架构的协议),它肯定在许多地方都在生产中使用。没有 HTTP 的 SOAP/SMTP 或 SOAP/TCP 很少见,但这些也存在。

Webservice is a also post request which contains soap envelope as request body

通过 HTTP 的 SOAP 调用是 POST 请求。但是,它可能不是内容类型 xml,因为某些变体,例如 SwA(带有附件的 SOAP)或 XOP+MTOM 变体可能会产生 MIME/Multipart 的 HTTP 有效负载(其中的第一部分是纯 XML 形式的 SOAP 信封)。
当要通过 SOAP 调用发送大量二进制内容时,这种用法最常见,二进制编码可能会为请求增加很大的权重(base64 是权重的 1.3 倍)。

java Stub internally marshal the XML, creates HTTP request and send it to consumer

这是通常的完成方式,Axis 框架和 JAXWS 框架主要以这种方式工作。

较旧的 SAAJ API,一个标准的 EE API,需要您使用 DOM API 手动构建 SOAP 消息,(请参阅 SOAPMessageFactory), 然后发送.

如果你看看 Spring WS,你会得到一些接近你的要求的东西,但每个部分都相当暴露并且在你的控制之下(你可以选择使用 DOM Api,其他使用 JAXB 编组,...)。

3)Servlet at consumer side intercpets that request and unrmashal it to java object and send it to corresponding service

同样,事情通常是这样进行的。但是您也可以有一个在 servlet 容器之外工作的实现。 (请参阅 JAX WS 中的端点服务 API)。

你的假设是正确的:-

是的,Servlet 请求和 Web 服务请求都是普通的 HTTP 请求,是的,SOAP Web 服务内部使用 HTTP POST。

是的,java 内部编组 XML。此外,在客户端,一个 java Web 服务客户端(可能是一个包裹在 servlet 中)解组它。 SOAP message 或 SOAP 类型的 Web 服务具有许多特征,例如:-

  • SOAP 消息主要使用 XML 格式发送数据。 XML 与技术无关。因此,SOAP 可以与使用两种不同技术构建的两个异构 Web 应用程序进行交互,并使用 XML 交换数据。
  • SOAP Web 服务使用 HTTP 协议发送 XML。使用 HTTP 的有效负载将数据包裹在 XML 中发送。
  • 可以保护 SOAP Web 服务。例如,所有使用信用卡和银行信息的支付相关交易都是使用安全的 SOAP 网络服务完成的。
  • SOAP Web 服务接受 XML 请求和 returns XML 响应。如果出现错误,此 return XMLs 也可能包含 SOAP 错误。 SOAP 错误包含错误描述和错误代码。
  • Web 服务可以通过其 XML 负载携带附件文档,如 PDF、Word 等。 Java 为此类网络服务提供单独的 API。在 java 中有一个名为 SAAJ 的 API 可以实现这一点。