SOAP Web服务是否仅支持“ POST” http方法


74

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

Answers:


90

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

编辑:经过一些研究,似乎并不完全正确,如您在此处所见。从理论上讲,可以使用GET,因为POST和GET是HTTP传输协议的方法,并且SOAP可以在HTTP上使用。

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


20

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消息返回的。那是,

因此GET和POST方法都可以使用。另一件事是,实际上大多数情况下使用POST方法。

不好的事情是,在将RESTful服务与SOAP服务进行比较时,作为REST的优点,人们带来了缓存,这在SOAP中是不可用的,因为SOAP仅使用POST。这是完全错误的。


0

这是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;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.