Клиент SOAP, следуя примеру
Мне нужно использовать SOAP-сервер с именем "Mouser" для моей компании. Однако у меня есть проблема, когда я пытаюсь отправить сообщение.
Документация моего запроса:
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>
Хорошо, теперь я буду, как вы мой код 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();
Вместо того, чтобы получить ответ, который я хочу от сервера, я получаю то же сообщение, которое я отправил, НО с новым ATTRIBUTE: 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>
Спасибо за помощь!
2 ответа
Я нашел, как это сделать! Спасибо всем, особенно на foolvoe99, потому что именно с вашей идеей я знал, где искать.
Я использовал "wsimport" для генерации Java-класса из WSDL и использовал их. Вот как я это сделал, так что это может помочь другим:
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);
На самом деле вы можете создать класс с мылом UI. И ваша программа может легко вызывать сервис, используя класс, созданный без создания собственного заголовка и тела запроса. Но вам нужна библиотека. Пример java jdk поставляется с jax-ws lib
учебное пособие: http://www.soapui.org/soap-and-wsdl/soap-code-generation.html