2015-06-22 3 views
3

Мне нужно использовать SOAP-сервер под названием «Mouser» для моей компании. Однако у меня есть проблема, когда я пытаюсь отправить сообщение.SOAP Client, следуя примеру

Документация моего запроса:

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> 

Спасибо за помощь!

+0

Как выглядит ваш файл WSDL? Не могли бы вы разместить соответствующие части WSDL службы на этот вопрос? Рассматривали ли вы вместо этого использование Apache CXF? –

+0

Попробуйте отправить запрос с помощью SOAPUI и посмотреть, что вы получаете. – Garry

+0

Это ссылка на файл WSDL: http://www.mouser.fr/service/searchapi.asmx?WSDL Как вы думаете, это проблема SAAJ? Apache CXF эквивалентен? –

ответ

0

Я нашел, как это сделать! Спасибо всем, особенно в 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); 
2

На самом деле вы можете сгенерировать класс с мылом ui. И ваша программа может легко вызвать службу, используя класс, созданный без создания собственного заголовка запроса и тела. Но вам нужна библиотека. Пример Java JDK поставляется с JAX-WS Lib

учебник: http://www.soapui.org/soap-and-wsdl/soap-code-generation.html