【问题标题】:Do SOAP Web services support only "POST" http methodSOAP Web 服务是否只支持“POST”http 方法
【发布时间】:2014-12-07 23:28:45
【问题描述】:

我在一次采访中遇到过这个问题,请问 SOAP Web 服务是否仅支持“POST”http 方法,或者是否有某种方式可以在服务器端接受其他方法?

【问题讨论】:

    标签: java web-services http post soap


    【解决方案1】:

    我一直使用 POST,但根据W3C standard,SOAP 支持 POST 和 GET 方法。

    编辑:经过一番研究,这似乎并不完全正确,如您所见here理论上可以使用 GET,因为 POST 和 GET 是 HTTP 传输协议的方法,而 SOAP 可以通过 HTTP 使用。

    但如您所知,GET 将请求包含在查询字符串中。 SOAP 请求(XML 消息)通常过于复杂和冗长而无法包含在查询字符串中,因此几乎每个实现(例如 JAX-WS)都只支持 POST。

    【讨论】:

      【解决方案2】:

      这是 SOAP 中 GET 的实现:

      @WebServiceProvider(targetNamespace="http://attachment.service.soap.com/download")
      @ServiceMode(value = javax.xml.ws.Service.Mode.MESSAGE)
      @BindingType(value = HTTPBinding.HTTP_BINDING)
      public final class ImageDownloadServiceProvider implements Provider<DataSource> {
          @Resource
          private WebServiceContext wsContext;
      
          @Override
          public DataSource invoke(DataSource request) {
              if (wsContext == null)
                  throw new RuntimeException("dependency injection failed on wsContext");
              MessageContext msgContext = wsContext.getMessageContext();
              HttpExchange exchange = (HttpExchange) msgContext.get("com.sun.xml.internal.ws.http.exchange");
              String filename = exchange.getRequestURI().getQuery().replace("file=", "");
              switch ((String) msgContext.get(MessageContext.HTTP_REQUEST_METHOD)) {
              case "GET":
                  return doGet(filename);
              default:
                  throw new HTTPException(405);
              }
          }
      
          private DataSource doGet(String filename) {
              FileDataSource fds = new FileDataSource(filename);
              MimetypesFileTypeMap mtftm = new MimetypesFileTypeMap();
              mtftm.addMimeTypes("image/jpeg jpg");
              fds.setFileTypeMap(mtftm);
              return fds;
          }
      

      【讨论】:

        【解决方案3】:

        Thread 已经成立三年了,但我认为仍有很多人会向自己提出同样的问题,并会在网络上找到错误的答案。问题的答案是否定的,GET方法也可以。

        根据 SOAP 规范,可以在这里找到:https://www.w3.org/TR/2007/REC-soap12-part0-20070427/#transport GET 和 POST 方法都可用于通过 http 交换 SOAP 消息。 使用 HTTP POST 方法在 HTTP 请求正文中传送 SOAP 消息使用了一种称为 SOAP 请求-响应消息交换模式的模式。在 HTTP GET 的情况下,使用称为 SOAP 响应消息交换模式的模式。这两种模式的主要区别在于:

        第一种类型的交互允许使用 HTTP POST 正文中的数据来创建或修改由 HTTP 请求所指向的 URI 标识的资源的状态。第二种类型的交互模式提供了使用 HTTP GET 请求获取资源表示的能力,而无需以任何方式改变其状态。在第一种情况下,特定于 SOAP 的关注点是 HTTP POST 请求的主体是一个 SOAP 消息,它必须被处理(根据 SOAP 处理模型)作为特定于应用程序的处理的一部分,以符合POST 语义。在第二种情况下,可以预见的典型用法是,所请求资源的表示不是作为 HTML 或实际上是通用 XML 文档返回,而是作为 SOAP 消息返回的情况。也就是说,响应消息的 HTTP 内容类型标头将其标识为媒体类型“application/soap+xml”

        所以 GET 和 POST 方法都可以使用。另一件事是在实践中主要使用 POST 方法。

        不好的是,当比较 RESTful 服务和 SOAP 服务时,作为 REST 的一个优势,人们带来了缓存,这在 SOAP 中不可用,因为 SOAP 只使用 POST。这是完全错误的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-03
          • 1970-01-01
          • 1970-01-01
          • 2021-05-14
          • 1970-01-01
          • 2010-09-11
          • 1970-01-01
          相关资源
          最近更新 更多