我在一次采访中遇到了这个问题,所以请您说一下SOAP Web服务是否仅支持“ POST” http方法,或者在服务器端是否有某种方法可以接受其他方法?
编辑:经过一番研究,似乎并不完全正确,正如您所看到的here。
从理论上可以使用GET,因为POST和GET是HTTP传输协议的方法,并且可以通过HTTP使用SOAP。
但是您知道,GET将请求包含在查询字符串中。 SOAP请求(XML消息)通常过于复杂和冗长,无法包含在查询字符串中,因此几乎每个实现(例如JAX-WS)仅支持POST。根据SOAP规范,可以在这里找到:https://www.w3.org/TR/2007/REC-soap12-part0-20070427/#transportGET和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。这是完全错误的。
@@ WebServiceProvider(targetNamespace =“ http://attachment.service.soap.com/download”)@ServiceMode(值= javax.xml.ws.Service.Mode.MESSAGE)@BindingType(值= HTTPBinding.HTTP_BINDING)公共最终类ImageDownloadServiceProvider实现Provider {@资源私有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;
}