Page 1 of 1

Postprocessing Wizard Webservices

PostPosted: 29 May 2018, 11:40
by ckuhl
Hallo zusammen,

ich habe gerade einen SOAP-basierten Webservice angebunden. Der Webservice-Call als solches funktioniert, der Postprocessing-Wizard schlägt aber beim Versuch einer Verbindung (im Übergang von Seite 1 auf Seite 2 des Wizards) fehl mit einer NullPointerException:

java.lang.NullPointerException
at com.rapidrep.gui.designer.main.tab.frame.function.webservices.postprocessing.pages.page01.GetWebServiceResponseCommand.execute(GetWebServiceResponseCommand.java:107)
at com.rapidrep.gui.designer.main.tab.frame.function.webservices.postprocessing.pages.page01.PostProcessingWizardPage1$1.run(PostProcessingWizardPage1.java:136)

Die Authentifizierung am Webservice erfolgt mit Username und Passwort, und es gibt keine weiteren Parameter. Was könnte hier die Fehlerursache sein?

Mit freundlichen Grüßen
Christian Kuhl

Re: Postprocessing Wizard Webservices

PostPosted: 29 May 2018, 13:56
by maerklw
Hallo Herr Kuhl,

um das Problem besser nachstellen zu können, starten Sie bitte erneut das fehlerhafte Postprocessing.
Anschliessend im Menu Werkzeuge /bzw. Tools die Aktion :
- Diagnosepaket erstellen
- alles anwählen
- das ZIP-FIle senden an: support@rapidrep.com

Vielen Dank

Werner Märkl

Re: Postprocessing Wizard Webservices

PostPosted: 29 May 2018, 13:59
by ChristoffSchmitz
Hallo Herr Kuhl,

möglicherweise liegt hier ein Bug vor.
Können Sie mal prüfen, welche Response-Header ihr WebService liefert, und ob der Response-Header "Content-Type" zurückgeliefert wird?

Code: Select all
$RD.webServiceCall().getResponseHeaders()

Re: Postprocessing Wizard Webservices

PostPosted: 29 May 2018, 15:16
by ckuhl
Hallo Herr Schmitz,

der content-type Response Header ist da. Insgesamt kommen folgende Header zurück:

set-cookie: sap-usercontext = sap-client=502
content-type: text/xml
accept: text/xml
sap-srt_id: 20180529/151308/v1.00_final_6.40/FA7D067040021ED898E84106B1780E43
sap-srt_server_info: ##########, 171, urn:sap-com:document:sap:soap:functions:mc-style, zse_test_rfc_ws, ZSeTestTableWs, 71
sap-srt_server_info_ext: 0

Mit freundlichen Grüßen
Christian Kuhl

Re: Postprocessing Wizard Webservices

PostPosted: 29 May 2018, 19:07
by ckuhl
Ein offenkundiger Workaround wäre natürlich, das generierte JavaScript herzunehmen und das entsprechende postprocessing (z.B. über eine XML File Structure, in unserem Beispiel $T056R) per Hand (in einer eigenen JavaScript Funktion $RD.WS_T056R) zu coden. Im konkreten Beispiel läuft das auf
Code: Select all

function WS_T056R() {
let argumentsMap = new java.util.HashMap();
let encodedArgumentsMap = new java.util.HashMap();
let headers = new java.util.HashMap();
headers.put($RR.eval("SOAPAction", argumentsMap), $RR.eval("urn:sap-com:document:sap:soap:functions:mc-style:zse_test_rfc_ws:ZSeTestTableWsRequest", argumentsMap));
let targetResource = $RR.eval("zse_test_rfc_ws", encodedArgumentsMap);
let requestBody = $RR.eval("<s11:Envelope xmlns:s11=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <s11:Body>\n <ns1:ZSeTestTableWs xmlns:ns1=\"urn:sap-com:document:sap:soap:functions:mc-style\"/>\n </s11:Body>\n</s11:Envelope>", argumentsMap);
let wsResult = $RR.httpPost("TestWS", targetResource, requestBody, $RR.eval("text/xml", argumentsMap), headers);

wsResult.setRequestBody(requestBody);
wsResult.setRequestHeaders(headers);
wsResult.setRequestResource(targetResource);

if (wsResult.getResponseCode() == 200) {
let xml = wsResult.getResponseBody();
wsResult.setTable($T056R.getNewStringInstance(xml).item().toString());
}
return wsResult;
}

hinaus, ein simples Skript mit
Code: Select all

SELECT * FROM $RD.WS_T056R()

liefert dann die Daten im gewünschten Format.
Nichtsdestotrotz wäre es auch gut, zu wissen, warum der Wizard nicht funktioniert.

Mit freundlichen Grüßen
Christian Kuhl

Re: Postprocessing Wizard Webservices

PostPosted: 30 May 2018, 09:46
by ChristoffSchmitz
Hallo Herr Kuhl,

hier liegt in Ihrer RapidRep Version leider ein Bug vor.
Aktuell können Sie sich leider nur mit Workarounds behelfen.
Um Komplexität zu reduzieren würde ich lediglich die Nachbearbeitung in eine eigene Funktion auslagern.

A) JS
let xml = $RD.wsCall().getResponseBody();
return $T056R.getNewStringInstance(xml).item().toString();

B) Textersetzung
#set($xml = $RD.wsCall().getResponseBody())
$T056R.getNewStringInstance($xml).item()


Der Bug wurde in unseren Systemen mit der Bugnummer 7891 erfasst und wird ab der Version 5.7.5 behoben sein.
Da Version 5.7.4 erst kürzlich herausgegeben wurde steht für 5.7.5 noch kein Zieldatum fest.

Re: Postprocessing Wizard Webservices

PostPosted: 01 Jun 2018, 10:23
by ckuhl
Hallo Herr Schmitz,

vielen Dank für die schnelle Antwort. Ich hätte eine weitere Frage in diesem Kontext: Gibt es für File Structures eine Möglichkeit der Reflexion ähnlich wie für Skripte, d.h. etwas in der Art von $CurrentReport.getScriptByName()? Hier hatte ich in der API nichts gefunden. Das wäre für den gegenwärtigen Anwendungsfall natürlich äußerst nützlich, da man ansonsten eine Reihe von Funktionen erzeugt, die sich nur in jeweils einem Aspekt voneinander unterscheiden.

Mit freundlichen Grüßen
Christian Kuhl

Re: Postprocessing Wizard Webservices

PostPosted: 01 Jun 2018, 15:56
by KaiBaechle
Hallo Herr Kuhl,

wenn Sie unten im Beispiel in der ersten Zeile in der Zuweisung $MyCSVStructure durch Ihre Struktur ersetzen, können Sie ausprobieren, welche Metadaten Sie über Ihre Struktur erhalten können. Data() ist ggf. durch den von Ihnen im Dateistrukturwizard für die Tabelle vergebenen Namen zu ersetzen.

Viele Grüße

Kai Bächle

#set($MyStructure = $MyCSVStructure)
/*
$MyStructure.getEncoding()
$MyStructure.getLineBreak()
$MyStructure.getHeader()
$MyStructure.getEmptyInstance().Data().TABLE().getDescription()
$RR.listElements($MyStructure.getEmptyInstance().Data().TABLE().getMetaDataColumns(), ",")
*/
SELECT *
FROM $RR.ResultSetMetaDataTable($MyStructure.getEmptyInstance().Data().TABLE().getResultSetMetaData())