2017-02-06 3 views
0

Ich versuche, ein SOAP 1.2 WS aufzurufen, die einen SOAP-Header benötigen.Hinzufügen von zwei Soap-Header-Tags

Ich verwende einen Integration Designer namens SAP Hana Cloud Integration, ich empfange eine vollständige XML-Nachricht, aber ohne Header und das Empfängersystem muss die MessageId empfangen, um die Daten zu akzeptieren. Das Skript voll ist, nahm ich das eine vom online documentation und I'v auf mein Bedürfnis angepasst:

Ich konnte es nach dem Aktivieren der Verwendung von SOAP-UI funktioniert WS-A-Adressierung und einen zufälligen UUID enter image description here machen erzeugen

im SOAP UI log ich herausgefunden habe, dass die Message-Header an den Empfänger gesendet wurde der folgende:

<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> 

ich habe versucht, die gleiche Header mit Groovy zu erstellen:

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; 
} 

Aber es hat sich gedreht, dass es unmöglich ist, zwei Wurzelknoten unter der Kopfzeile zu setzen, hier ist die Fehlermeldung: Ursache: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: Es wurde versucht, einen Knoten einzufügen, wo es nicht erlaubt ist .

Irgendeine Idee, wie man das erreicht? Vielen Dank ! BR, Amin.

+0

Was ist Ihre Testfallstruktur? Wenn Soapui sich um diese kümmern kann, warum mit Groovy? Können Sie die rohe Anfrage des gleichen prüfen, wenn es doppelte Daten hat? Übrigens, das obige Skript scheint nicht voll zu sein, nur ein Teil davon? Schließlich senden Sie die Anfrage mit groovy oder Anfrage Testschritt? – Rao

+0

Ich verwende einen Integrationsdesigner namens SAP Hana Cloud Integration. Ich erhalte eine vollständige XML-Nachricht ohne Header und das Empfängersystem muss die MessageId empfangen, um die Daten zu akzeptieren. Das Skript ist voll, ich nahm das eine aus der Online-Dokumentation und ich habe mich an meine Bedürfnisse angepasst: [link] (https://proddps.hana.ondemand.com/dps/d/preview/93810d568bee49c6b3d7b5065a30b0ff/2015.10/ en-US/frameset.html? 999aa87a429846a4a3f3f8d5818dd0d5.html) –

+0

Können Sie bitte durch die vorherigen Kommentare/Fragen gehen und aktualisieren? – Rao

Antwort

0

Via groovy Skript in 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; 
} 

In Designer Web-Anwendung (nicht ECLIPSE) viel einfacher:

Inhalt Modifier -> Message Header vor dem Senden Anfrage -> YourHeader | Konstante | java.lang.String | YourValue ...