Tôi gặp khó khăn khi gọi một Web SOAP 1.2 WebService thông qua Spring-ws WebServiceTemplate. Yêu cầu được thực hiện là thiếu SOAPAction trong Http Header và máy chủ ném một lỗi với "Không thể xử lý yêu cầu mà không có tham số hành động hợp lệ. Vui lòng cung cấp một hành động xà phòng hợp lệ." Tôi đã có thể tìm ra hành động SOAP bị thiếu bằng cách giám sát thông qua wireshark. Tôi cũng không đứng sau bất kỳ proxy nào.Spring WebServiceTemplate SOAPAction bị thiếu trong Tiêu đề HTTP
Tôi đã đảm bảo rằng XML SOAP mà tôi đang cố gắng gửi là hợp lệ bằng cách chạy yêu cầu qua TCP Mon (công cụ như SOAP UI) và có thể nhận phản hồi.
Dưới đây là cấu hình mùa xuân của tôi:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
<property name="soapVersion">
<util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12" />
</property>
</bean>
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory" />
<property name="defaultUri" value="https://ecomapi.networksolutions.com/soapservice.asmx" />
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender" /> </property>
</bean>
Và đây là mã java của tôi:
public void simpleSendAndReceive() {
try{
StreamSource source = new StreamSource(new StringReader(MESSAGE));
StreamResult result = new StreamResult(System.out);
SoapActionCallback actionCallBack = new SoapActionCallback("https://ecomapi.networksolutions.com/soapservice.asmx") {
public void doWithMessage(WebServiceMessage msg) {
SoapMessage smsg = (SoapMessage)msg;
smsg.setSoapAction("http://networksolutions.com/ReadOrder");
}
};
webServiceTemplate.sendSourceAndReceiveToResult(
"https://ecomapi.networksolutions.com/soapservice.asmx",
source,
new SoapActionCallback("http://networksolutions.com/ReadOrder"),
// actionCallBack,
result);
System.out.println(source.getInputStream().toString());
System.out.println(result.getWriter().toString());
}catch (SoapFaultClientException e) {
System.out.println(e.getFaultCode());
System.out.println(e.getFaultStringOrReason());
System.out.println(e.fillInStackTrace().getLocalizedMessage());
} catch (WebServiceIOException we) {
System.out.println(we.getRootCause());
}
}
Dường như bạn đang đặt tiêu đề Hành động SOAP theo nhiều cách ở đây đúng - sử dụng 'actionCallBack', sử dụng' SoapActionCallback..' mới, cả hai cách tiếp cận không hoạt động? –
Thats chính xác. Cả hai cách tiếp cận đều cho cùng một lỗi. – user1546703
Bạn yêu cầu tiêu đề 'http: // networksolutions.com/ReadOrder' ngay - bạn sẽ thấy tiêu đề nào trên dây bằng cách sử dụng công cụ Wireshark. Chỉ muốn đảm bảo rằng bạn không gửi 'https: // ecomapi.networksolutions.com/soapservice.asmx'. Đây là một công cụ đơn giản để nắm bắt những gì đang diễn ra - http://sourceforge.net/projects/nettool/ –