使用 SOAP WebService 时出现 Java 问题
Consuming SOAP WebService with Java issue
我阅读了很多关于 Whosebug 的教程和类似问题,但我仍然无法连接到我的 SOAP 服务。
我正在尝试使用 Java 调用 SOAP Web 服务。我在这里找到了一个很好的答案:
该示例按原样完美运行,但当我将其更改为另一个 wsdl 文件时,它不再运行:
public static void main(String args[]) throws Exception {
// Create SOAP Connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
// Send SOAP Message to SOAP Server
String url = "http://192.168.200.165/soap/server.php";
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);
// print SOAP Response
System.out.print("Response SOAP Message:");
soapResponse.writeTo(System.out);
soapConnection.close();
}
private static SOAPMessage createSOAPRequest() throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
String serverURI = "urn:BoardSOAP";
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("soap", serverURI);
System.out.println(envelope.getNamespaceURI());
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", serverURI + "getBoardStatus");
soapMessage.saveChanges();
/* Print the request message */
System.out.print("Request SOAP Message:");
soapMessage.writeTo(System.out);
System.out.println();
return soapMessage;
}
如您所见,我更改了这些行:
String url = "http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx";
String serverURI = "http://ws.cdyne.com/";
headers.addHeader("SOAPAction", serverURI + "ReturnCodes");
String url = "http://192.168.200.165/soap/server.php";
String serverURI = "urn:BoardSOAP";
headers.addHeader("SOAPAction", serverURI + "getBoardStatus");
这是我的 wsdl 文件:
完整输出:
http://schemas.xmlsoap.org/soap/envelope/
Request SOAP Message:<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="urn:BoardSOAP"><SOAP-ENV:Header/><SOAP-ENV:Body/></SOAP-ENV:Envelope>
Response SOAP Message:<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body><SOAP-ENV:Fault><faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode><faultactor xsi:type="xsd:string"></faultactor><faultstring xsi:type="xsd:string">Operation '' is not defined in the WSDL for this service</faultstring><detail xsi:type="xsd:string"></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
WSDL 文件没有损坏,我可以通过 SoupUI 与之通信没有问题。
在您引用的答案中,ReturnCodes
的 soapAction
是 http://ws.cdyne.com/ReturnCodes
,由行 headers.addHeader("SOAPAction", serverURI + "ReturnCodes");
构成
但是,在您的 WSDL 中,由于您使用的不是 URL,而是名称空间标识符的 URN,因此 getBoardStatus
的 soapAction
是 urn:server#getBoardStatus
。如果您使用相同的串联方案,您将缺少 #
和 您将使用 urn:BoardSoap
而不是 urn:server
。
尝试使用`headers.Header("SOAPAction", "urn:server#getBoardStatus").
这种方式也适用于我:
saajSoapMessage.setSoapAction("urn:server#getBoardStatus");
我阅读了很多关于 Whosebug 的教程和类似问题,但我仍然无法连接到我的 SOAP 服务。
我正在尝试使用 Java 调用 SOAP Web 服务。我在这里找到了一个很好的答案:
该示例按原样完美运行,但当我将其更改为另一个 wsdl 文件时,它不再运行:
public static void main(String args[]) throws Exception {
// Create SOAP Connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
// Send SOAP Message to SOAP Server
String url = "http://192.168.200.165/soap/server.php";
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);
// print SOAP Response
System.out.print("Response SOAP Message:");
soapResponse.writeTo(System.out);
soapConnection.close();
}
private static SOAPMessage createSOAPRequest() throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
String serverURI = "urn:BoardSOAP";
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("soap", serverURI);
System.out.println(envelope.getNamespaceURI());
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", serverURI + "getBoardStatus");
soapMessage.saveChanges();
/* Print the request message */
System.out.print("Request SOAP Message:");
soapMessage.writeTo(System.out);
System.out.println();
return soapMessage;
}
如您所见,我更改了这些行:
String url = "http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx";
String serverURI = "http://ws.cdyne.com/";
headers.addHeader("SOAPAction", serverURI + "ReturnCodes");
String url = "http://192.168.200.165/soap/server.php";
String serverURI = "urn:BoardSOAP";
headers.addHeader("SOAPAction", serverURI + "getBoardStatus");
这是我的 wsdl 文件:
完整输出:
http://schemas.xmlsoap.org/soap/envelope/
Request SOAP Message:<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="urn:BoardSOAP"><SOAP-ENV:Header/><SOAP-ENV:Body/></SOAP-ENV:Envelope>
Response SOAP Message:<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body><SOAP-ENV:Fault><faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode><faultactor xsi:type="xsd:string"></faultactor><faultstring xsi:type="xsd:string">Operation '' is not defined in the WSDL for this service</faultstring><detail xsi:type="xsd:string"></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
WSDL 文件没有损坏,我可以通过 SoupUI 与之通信没有问题。
在您引用的答案中,ReturnCodes
的 soapAction
是 http://ws.cdyne.com/ReturnCodes
,由行 headers.addHeader("SOAPAction", serverURI + "ReturnCodes");
但是,在您的 WSDL 中,由于您使用的不是 URL,而是名称空间标识符的 URN,因此 getBoardStatus
的 soapAction
是 urn:server#getBoardStatus
。如果您使用相同的串联方案,您将缺少 #
和 您将使用 urn:BoardSoap
而不是 urn:server
。
尝试使用`headers.Header("SOAPAction", "urn:server#getBoardStatus").
这种方式也适用于我:
saajSoapMessage.setSoapAction("urn:server#getBoardStatus");