Как кодировать мыльный клиент в Java?

1

У меня есть xml

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <soap:Body>
<SendRequest xmlns="http://tempuri.org/">
  <auth xmlns="">
    <Login xmlns="http://tempuri.org/">vcm</Login>
    <Password xmlns="http://tempuri.org/">vcm</Password>
  </auth>
  <Request xmlns="">
        <Request_code xmlns="http://     tempuri.org/">1</Request_code>
        <Message_Code xmlns="http://tempuri.org/">1111</Message_Code>
        <Params xmlns="http://  tempuri.org/">
      <RequestParameter>
        <Name />
        <Value />
      </RequestParameter>
    </Params>
  </Request>
   </SendRequest>
 </soap:Body>
</soap:Envelope>

И код Java

MessageFactory messageFactory = MessageFactory.newInstance();
    SOAPMessage soapMessage = messageFactory.createMessage();
    SOAPPart soapPart = soapMessage.getSOAPPart();

    // SOAP Envelope
    SOAPEnvelope envelope = soapPart.getEnvelope();
    envelope.removeAttribute("xmlns:SOAP-ENV");
    envelope.setPrefix("soap");
    envelope.addNamespaceDeclaration("xsd", "http://www.w3.org/2001/XMLSchema");
    envelope.addNamespaceDeclaration("xsi", "http://www.w3.org/2001/XMLSchema-instance");

    MimeHeaders mimeheaders = soapMessage.getMimeHeaders();
    mimeheaders.addHeader("SOAPAction", "SendRequest");
    SOAPHeader header = soapMessage.getSOAPHeader();
    header.detachNode();

    SOAPBody soapBody = envelope.getBody();
    soapBody.setPrefix("soap");
    SOAPElement sendRequest = soapBody.addChildElement("SendRequest");
    SOAPElement auth = sendRequest.addChildElement("auth");
    auth.addChildElement("Login")
        .addTextNode("vcm");
    auth.addChildElement("Password")
        .addTextNode("vcm");

    SOAPElement request = sendRequest.addChildElement("Request");
    request.addChildElement("Request_code")
            .addTextNode("1");
    request.addChildElement("Message_Code")
            .addTextNode("1111");
    request.addChildElement("Params");
    sendRequest.addAttribute(new QName("xmlns"), "http://tempuri.org/");
    soapMessage.saveChanges();

    /* Print the request message */
    System.out.print("Request SOAP Message:");
    soapMessage.writeTo(System.out);
    System.out.println();

Я консоль вижу тег без " http://tempuri.org/ ". И если я пишу, например,

sendRequest.addAttribute(new QName("aaa"), "http://tempuri.org/") 

Я имею

<SendRequest aaa="http://tempuri.org/">

Как написать java-код?

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

Теги:
soap

2 ответа

1

Вы не добавляете пространство имен к элементу.

Пытаться

SOAPElement sendRequest = soapBody.addChildElement(
  new QName("http://tempuri.org/", "SendRequest"));

вместо

SOAPElement sendRequest = soapBody.addChildElement("SendRequest");

Обратите внимание, что, вероятно, это хорошая идея, чтобы разделить множественные ссылки на URI пространства имен в константу/переменную.

  • 0
    Спасибо, но теперь я не могу добавить атрибут в тег <auth> ?. SOAPElement auth = sendRequest.addChildElement (new QName ("", "auth")); В консоли я вижу <auth> без атрибута
  • 0
    Это наиболее вероятно, потому что вы не добавляете ничего в атрибут auth вы создаете. Попробуйте использовать auth.addAttribute(...) . Могу ли я предположить, что вы используете код от другого разработчика?
0

Спасибо за вашу помощь ! И этот код работает нормально

  MessageFactory messageFactory = MessageFactory.newInstance();
    SOAPMessage soapMessage = messageFactory.createMessage();
    SOAPPart soapPart = soapMessage.getSOAPPart();

    // SOAP Envelope
    SOAPEnvelope envelope = soapPart.getEnvelope();
    envelope.removeAttribute("xmlns:SOAP-ENV");
    envelope.setPrefix("soap");
    envelope.addNamespaceDeclaration("xsd", "http://www.w3.org/2001/XMLSchema");
    envelope.addNamespaceDeclaration("xsi", "http://www.w3.org/2001/XMLSchema-instance");

    MimeHeaders mimeheaders = soapMessage.getMimeHeaders();
    mimeheaders.addHeader("SOAPAction", "SendRequest");
    SOAPHeader header = soapMessage.getSOAPHeader();
    header.detachNode();

    SOAPBody soapBody = envelope.getBody();
    soapBody.setPrefix("soap");
    QName xmlns = new QName("xmlns");
    SOAPElement sendRequest = soapBody.addChildElement(new QName("http://tempuri.org/", "SendRequest"));
    sendRequest.addAttribute(xmlns, "");
    SOAPElement auth = sendRequest.addChildElement(new QName("", "auth"));

    auth.addChildElement(new QName("http://tempuri.org/", "Login"))
        .addAttribute(new QName("xmlns"), "http://tempuri.org/")
        .addTextNode("vcm");
    auth.addChildElement(new QName("http://tempuri.org/", "Password"))
        .addAttribute(new QName("xmlns"), "http://tempuri.org/")
        .addTextNode("vcm");

    SOAPElement request = sendRequest.addChildElement(new QName("", "Request"));
    request.addAttribute(new QName("xmlns"), "");

    request.addChildElement(new QName("http://tempuri.org/", "Request_code"))
            .addAttribute(new QName("xmlns"), "http://tempuri.org/")
            .addTextNode("1");
    request.addChildElement(new QName("http://tempuri.org/", "Message_Code"))
            .addAttribute(new QName("xmlns"), "http://tempuri.org/")
            .addTextNode("1111");

    SOAPElement params = request.addChildElement(new QName("http://tempuri.org/", "Params"));

    SOAPElement requesParameter = params.addChildElement("RequestParameter");
    requesParameter.addChildElement("Name");
    requesParameter.addChildElement("Value");

    soapMessage.saveChanges();

    /* Print the request message */
    System.out.print("Request SOAP Message:");
    soapMessage.writeTo(System.out);
    System.out.println();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню