Java SOAP客户端,下面是一个示例

Java SOAP客户端,下面是一个示例,java,soap,saaj,Java,Soap,Saaj,我需要为我的公司使用一个名为“Mouser”的SOAP服务器。然而,当我试图发送消息时,我遇到了一个问题 我的请求文件如下: POST /service/searchapi.asmx HTTP/1.1 Host: www.mouser.fr Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap12

我需要为我的公司使用一个名为“Mouser”的SOAP服务器。然而,当我试图发送消息时,我遇到了一个问题

我的请求文件如下:

POST /service/searchapi.asmx HTTP/1.1
Host: www.mouser.fr
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <soap12:Header>
        <MouserHeader xmlns="http://api.mouser.com/service">
            <AccountInfo>
                <PartnerID>string</PartnerID>
            </AccountInfo>
        </MouserHeader>
    </soap12:Header>
   <soap12:Body>
        <SearchByPartNumber xmlns="http://api.mouser.com/service">
             <mouserPartNumber>string</mouserPartNumber>
        </SearchByPartNumber>
   </soap12:Body>
</soap12:Envelope>
POST/service/searchapi.asmx HTTP/1.1
主持人:www.mouser.fr
内容类型:应用程序/soap+xml;字符集=utf-8
内容长度:长度
一串
一串
好的,现在我将用我发送的消息介绍我的Java代码:

String mpns = "BAV99";

SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();

SOAPMessage message = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage();

MimeHeaders mimeHeader = message.getMimeHeaders();
mimeHeader.setHeader("Content-Type", "application/soap+xml; charset=utf-8");

SOAPPart soapPart = message.getSOAPPart();
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
        + "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\n"
        + "  <soap12:Header>\n"
        + "    <MouserHeader xmlns=\"http://api.mouser.com/service\">\n"
        + "      <AccountInfo>\n"
        + "        <PartnerID>" + key + "</PartnerID>\n"
        + "      </AccountInfo>\n"
        + "    </MouserHeader>\n"
        + "  </soap12:Header>\n"
        + "  <soap12:Body>\n"
        + "    <SearchByPartNumber xmlns=\"http://api.mouser.com/service\">\n"
        + "      <mouserPartNumber>" + mpns + "</mouserPartNumber>\n"
        + "    </SearchByPartNumber>\n"
        + "  </soap12:Body>\n"
        + "</soap12:Envelope>";

StreamSource source = new StreamSource(new StringReader(xml));
soapPart.setContent(source);
message.saveChanges();

System.out.println("Send : ");
message.writeTo(System.out);
System.out.println();

java.net.URL endpoint = new URL(targetUrl);
SOAPMessage reply = connection.call(message, endpoint);

StringWriter sw = new StringWriter();
TransformerFactory.newInstance().newTransformer().transform(new DOMSource(message.getSOAPPart()), new StreamResult(sw));
connection.close();
System.out.println("Received : ");
System.out.println(sw.toString());
return sw.toString();
String mpns=“BAV99”;
SOAPConnection=SOAPConnectionFactory.newInstance().createConnection();
SOAPMessage message=MessageFactory.newInstance(SOAPConstants.SOAP_1_2_协议).createMessage();
MimeHeaders mimeHeader=message.getMimeHeaders();
setHeader(“内容类型”,“应用程序/soap+xml;字符集=utf-8”);
SOAPPart SOAPPart=message.getSOAPPart();
字符串xml=“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“+key+”\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“\n”
+“+mpns+”\n”
+“\n”
+“\n”
+ "";
StreamSource=新的StreamSource(新的StringReader(xml));
soapPart.setContent(来源);
message.saveChanges();
System.out.println(“发送:”);
消息写入(系统输出);
System.out.println();
java.net.URL端点=新URL(targetUrl);
SOAPMessage reply=connection.call(消息,端点);
StringWriter sw=新的StringWriter();
TransformerFactory.newInstance().newTransformer().transform(新DOMSource(message.getSOAPPart()),新StreamResult(sw));
connection.close();
系统输出打印项次(“接收:”;
System.out.println(sw.toString());
返回sw.toString();
我没有从服务器上获得我想要的响应,而是收到了与我发送的消息相同的消息,但带有新属性:standalone=“no” 这是什么意思?为什么会有这样的反应

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <soap12:Header>
        <MouserHeader xmlns="http://api.mouser.com/service">
            <AccountInfo>
                <PartnerID>key</PartnerID>
            </AccountInfo>
        </MouserHeader>
    </soap12:Header>
   <soap12:Body>
        <SearchByPartNumber xmlns="http://api.mouser.com/service">
             <mouserPartNumber>BAV99</mouserPartNumber>
        </SearchByPartNumber>
   </soap12:Body>
</soap12:Envelope>

钥匙
BAV99

谢谢你的帮助

实际上,您可以使用soap ui生成类。您的程序可以使用创建的类轻松调用服务,而无需构建自己的请求头和请求体 但是你需要一些图书馆。示例javajdk附带jax-ws-lib


教程:

我找到了该怎么做!谢谢大家,特别是在傻瓜99,因为正是因为有了你的想法,我才知道去哪里搜索

我使用“wsimport”从WSDL生成java类并使用它们。 以下是我是如何做到这一点的,这样可以帮助其他人:

URL wsdlLocation = new URL("your_wsdl_target");
QName apiName = new QName("your_service_target", "your_service_name");
your_service_name api = new your_service_name(wsdlLocation, apiName);
api.addPort(your_service_name, SOAPBinding.SOAP12HTTP_BINDING, "your_service_target/name");

QName port_name = new QName("your_service_target", "port_name");
Dispatch<SOAPMessage> disp = api.createDispatch(port_name, SOAPMessage.class, Service.Mode.MESSAGE);            

String xml = "Your SOAP MESSAGE";

MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
SOAPMessage request = mf.createMessage();
SOAPPart part = request.getSOAPPart();
StreamSource source = new StreamSource(new StringReader(xml));
part.setContent(source);
request.saveChanges();

SOAPMessage response = disp.invoke(request);

StringWriter sw = new StringWriter();
TransformerFactory.newInstance().newTransformer().transform(new DOMSource(response.getSOAPPart()), new StreamResult(sw));
org.json.JSONObject xmlJSONObj = XML.toJSONObject(sw.toString());
return xmlJSONObj.toString(2);
URL wsdlLocation=新URL(“您的wsdl目标”);
QName apiName=新QName(“您的服务目标”、“您的服务名称”);
您的\u服务\u名称api=新的\u服务\u名称(wsdlLocation,apiName);
addPort(您的_服务_名称,SOAPBinding.SOAP12HTTP_绑定,“您的_服务_目标/名称”);
QName端口名称=新的QName(“您的服务目标”、“端口名称”);
Dispatch disp=api.createDispatch(端口名称,SOAPMessage.class,Service.Mode.MESSAGE);
String xml=“您的SOAP消息”;
MessageFactory mf=MessageFactory.newInstance(SOAPConstants.SOAP\u 1\u 2\u协议);
SOAPMessage请求=mf.createMessage();
SOAPPart=request.getSOAPPart();
StreamSource=新的StreamSource(新的StringReader(xml));
第三部分内容(来源);
request.saveChanges();
SOAPMessage response=disp.invoke(请求);
StringWriter sw=新的StringWriter();
TransformerFactory.newInstance().newTransformer().transform(新DOMSource(response.getSOAPPart()),新StreamResult(sw));
org.json.JSONObject xmlJSONObj=XML.toJSONObject(sw.toString());
返回xmlJSONObj.toString(2);

您的WSDL文件是什么样子的?您能将服务WSDL的相关部分发布到这个问题上吗?您考虑过使用Apache CXF吗?尝试使用SOAPUI发送请求,看看您得到了什么。这是WSDL文件的链接:您认为这是SAAJ的问题吗?ApacheCXF是一个等价物吗?我尝试使用访问SOAPUI,但我认为需要一个有效的密钥。这就是我得到的“服务器无法处理请求。-->无效的唯一标识符”嗨,Garry,我一分钟前刚刚用SOAP-UI尝试过,这很有效!我可以看到我想要的真实响应,但现在我需要它在我的Java项目中。您收到此响应是因为您没有Mouser帐户