Генерация SOAP-запроса

1

Я попытался создать следующий запрос SOAP:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:loc="http://www.csapi.org/schema/parlayx/data/sync/v1_0/local"> 
<soapenv:Header/> 
<soapenv:Body> 
<loc:syncOrderRelationResponse> 
<loc:result>0</loc:result> 
<loc:resultDescription>OK</loc:resultDescription> 
</loc:syncOrderRelationResponse> 
</soapenv:Body> 
</soapenv:Envelope>

И я использую следующий код:

    MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage outgoingMessage = messageFactory.createMessage();
        SOAPPart soappart = outgoingMessage.getSOAPPart();
        SOAPEnvelope envelope = soappart.getEnvelope();

        envelope.setAttribute("xmlns:loc" , "http://www.csapi.org/s");
        SOAPHeader header = envelope.getHeader();
        SOAPBody body = envelope.getBody();
        QName bodyName = new QName("", "syncOrderRelationResponse", "loc");
        SOAPBodyElement purchaseLineItems = body.addBodyElement(bodyName);


        QName childName = new QName("","result","loc");
        SOAPElement product = purchaseLineItems.addChildElement(childName);
        product.addTextNode("0");

        childName = new QName("","resultDescription","loc");
        SOAPElement product = purchaseLineItems.addChildElement(childName);
        product.addTextNode("0");

Когда я выполняю код, я не получаю ответа, но когда я помещаю namespaceURL, я получил ответ.

не могли бы вы мне помочь? Спасибо за поддержку

Теги:
soap

1 ответ

0

Вы получаете XML-ошибку, потому что ваше использование пространств имен не является связным во всем процессе и в конечном итоге приводит к нарушению спецификации XML.

Первое:

envelope.setAttribute("xmlns:loc" , "http://www.csapi.org/s");

Значит, вы добавляете в свой документ объявление префикса пространства имен (префикс loc), который обозначает пространство имен, указанное http://www.csapi.org/s.

Это означает, что с этого момента, если вы объявите XML-элемент, используя этот синтаксис <loc:tag>, то tag будет элементом XML, который принадлежит пространству имен http://www.csapi.org/s.

Когда вы подпольно объявляете QName таким образом

QName childName = new QName("","result","loc");

Вы готовите элемент XML, который имеет 3 характеристики:

  1. Он принадлежит пустому пространству имен (первый аргумент)
  2. Его локальное имя в пустом пространстве имен является "результатом" (2-й аргумент)
  3. Вы хотите, чтобы его локальное имя было префикс "loc" (третий аргумент)

Что ОК (по крайней мере, реализация так думает). Пока вы не добавите это QName в свой документ: на этом этапе вашего XML-документа префикс "loc" не обозначает пустое пространство имен. Таким образом, вы, по сути, просите реализацию XML переопределить префикс "loc" для обозначения "пустого пространства имен", чтобы соответствовать вашему утверждению. Но пустое пространство имен является особым в XML, оно не может быть префиксным (см. Http://www.w3.org/TR/REC-xml-names/#ns-using)

В объявлении пространства имен для префикса (то есть, где NSAttName является PrefixedAttName), значение атрибута НЕ ДОЛЖНО быть пустым.

Однако учтите, что, учитывая ваш пример, это действительно повезло, потому что "добавление элемента <result> из пустого пространства имен" НЕ является тем, что вы хотите сделать. То, что вы хотите сделать, это добавить элемент результата из пространства имен " http://www.csapi.org/s ".

Поэтому согласованная обработка пространства имен обеспечивает ожидаемый результат:

String namespace = "http://www.csapi.org/s";

SOAPHeader header = envelope.getHeader();
SOAPBody body = envelope.getBody();

QName bodyName = new QName(namespace, "syncOrderRelationResponse");
SOAPBodyElement purchaseLineItems = body.addBodyElement(bodyName);


QName childName = new QName(namespace,"result");
SOAPElement product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");

childName = new QName(namespace,"resultDescription");
product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");

outgoingMessage.writeTo(System.out);

Выводит правильное представление о том, что вы ищете.

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
  <syncOrderRelationResponse xmlns="http://www.csapi.org/s">
     <result>0</result>
     <resultDescription>0</resultDescription>
  </syncOrderRelationResponse>
</SOAP-ENV:Body></SOAP-ENV:Envelope>

Хотя, если вы действительно хотите, чтобы префикс пространства имен отображался, вы можете сделать это так:

String namespace = "http://www.csapi.org/s";
String nsPrefix = "loc";

envelope.setAttribute("xmlns:" + nsPrefix , namespace);
SOAPHeader header = envelope.getHeader();
SOAPBody body = envelope.getBody();

QName bodyName = new QName(namespace, "syncOrderRelationResponse", nsPrefix);
SOAPBodyElement purchaseLineItems = body.addBodyElement(bodyName);


QName childName = new QName(namespace,"result", nsPrefix);
SOAPElement product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");

childName = new QName(namespace,"resultDescription", nsPrefix);
product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");
  • 0
    Спасибо за вашу отличную поддержку. Работает нормально.
  • 0
    Спасибо, что приняли ответ, если он был вам полезен

Ещё вопросы

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