Добавление двух тегов заголовка Soap

Я пытаюсь вызвать SOAP 1.2 WS, которому нужен заголовок SOAP.

Я использую дизайнер интеграции под названием SAP Hana Cloud Integration, я получаю полное XML-сообщение, но без заголовка, и система-получатель должна получить MessageId, чтобы принять данные. Скрипт полный, я взял тот, что взят из онлайн-документация, и я адаптировал ее к своим потребностям:

Мне удалось заставить его работать с помощью пользовательского интерфейса SOAP после включения адресации WS-A и заставить его генерировать случайный UUID введите здесь описание изображения

В журнале пользовательского интерфейса SOAP я обнаружил, что заголовок сообщения, отправленного получателю, был следующим:

<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
   <wsa:MessageID>uuid:8122ffc1-62ee-436c-a284-224e49988013</wsa:MessageID>
   <wsa:Action>http://sap.com/xi/AP/HumanCapitalManagementMasterDataReplication/Global/HumanCapitalManagementMasterDataReplicationEmployeeMasterDataReplicationIn/ReplicateCompleteEmployeeMasterDataRequest</wsa:Action>
</soap:Header>

Я попытался создать тот же заголовок с помощью Groovy:

import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.headers.Header;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.sap.it.api.ITApiFactory;
import com.sap.it.api.securestore.SecureStoreService;
import com.sap.it.api.securestore.UserCredential;


def Message processData(Message message) {
String uuid = "uuid:" + UUID.randomUUID().toString();

String ActionUrl ="http://sap.com/xi/AP/HumanCapitalManagementMasterDataReplication/Global/HumanCapitalManagementMasterDataReplicationEmployeeMasterDataReplicationIn/ReplicateCompleteEmployeeMasterDataRequest";

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setIgnoringElementContentWhitespace(true);
dbf.setValidating(false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();

//WSA MessageID
Element MessageId = doc.createElementNS("http://www.w3.org/2005/08/addressing", "wsa:MessageID");  
MessageId.setTextContent(uuid);
doc.appendChild(MessageId);

//WSA Action
Element Action = doc.createElementNS("http://www.w3.org/2005/08/addressing", "wsa:Action");  
Action.setTextContent(ActionUrl);
doc.appendChild(Action);

SoapHeader header = new SoapHeader(new QName("http://www.w3.org/2005/08/addressing", MessageId.getLocalName()), MessageId);         
header.setMustUnderstand(true);
List  headersList  = new ArrayList<SoapHeader>();
headersList.add(header);

SoapHeader header2 = new SoapHeader(new QName("http://www.w3.org/2005/08/addressing", Action.getLocalName()), Action);         
headersList.add(header2);
header2.setMustUnderstand(true);
message.setHeader("org.apache.cxf.headers.Header.list", headersList);

return message;
}

Но оказалось, что невозможно установить два корневых узла под заголовком, вот сообщение об ошибке: причина: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: Была сделана попытка вставить узел, где это не разрешено.

Любая идея о том, как этого добиться? Спасибо ! БР, Амин.


person Mohamed Amine FRAYJIA    schedule 06.02.2017    source источник
comment
какова ваша структура тестового примера? Когда мылоуи может позаботиться об этом, зачем делать это с помощью groovy? Можете ли вы проверить необработанный запрос того же самого, если он имеет дублирующиеся данные? кстати, вышеприведенный скрипт вроде не полный, только его часть? Наконец, вы отправляете запрос с помощью шага groovy или запроса?   -  person Rao    schedule 07.02.2017
comment
Я использую дизайнер интеграции под названием SAP Hana Cloud Integration, я получаю полное XML-сообщение, но без заголовка, и система-получатель должна получить MessageId, чтобы принять данные. Сценарий полный, я взял его из онлайн-документации и адаптировал под свои нужды: -US/frameset.html?999aa87a429846a4a3f3f8d5818dd0d5.html" rel="nofollow noreferrer">ссылка   -  person Mohamed Amine FRAYJIA    schedule 07.02.2017
comment
Не могли бы вы просмотреть предыдущие комментарии/вопросы и обновить?   -  person Rao    schedule 07.02.2017
comment
Цель groovy script - просто создать запрос?   -  person Rao    schedule 07.02.2017
comment
Да просто изменить заголовок.   -  person Mohamed Amine FRAYJIA    schedule 07.02.2017
comment
Можете ли вы показать, как вы получаете запрос в скрипте groovy? У него есть пустой элемент Header?   -  person Rao    schedule 07.02.2017


Ответы (1)


Через отличный скрипт в HCI:

import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
def Message processData(Message message) {

       //Headers 
       def map = message.getHeaders();
       def value = map.get("oldHeader");
       message.setHeader("oldHeader", value + "modified");
       message.setHeader("newHeader", "yourValue");

       return message;
}

В дизайнерском веб-приложении (не ECLIPSE) намного проще:

Content Modifier -> Заголовок сообщения перед отправкой запроса -> YourHeader | Константа | java.lang.String | Ваша ценность...

person dotchuZ    schedule 25.08.2017