Postprocessing Wizard Webservices

Community help and discussion for RapidRep Designer Application

Postprocessing Wizard Webservices

Postby ckuhl » 29 May 2018, 11:40

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
ckuhl
 
Posts: 6
Joined: 01 Dec 2017, 18:22

Re: Postprocessing Wizard Webservices

Postby maerklw » 29 May 2018, 13:56

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
maerklw
 
Posts: 15
Joined: 20 Feb 2014, 22:51

Re: Postprocessing Wizard Webservices

Postby ChristoffSchmitz » 29 May 2018, 13:59

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()
ChristoffSchmitz
 
Posts: 11
Joined: 20 Aug 2013, 09:54

Re: Postprocessing Wizard Webservices

Postby ckuhl » 29 May 2018, 15:16

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
ckuhl
 
Posts: 6
Joined: 01 Dec 2017, 18:22

Re: Postprocessing Wizard Webservices

Postby ckuhl » 29 May 2018, 19:07

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
ckuhl
 
Posts: 6
Joined: 01 Dec 2017, 18:22

Re: Postprocessing Wizard Webservices

Postby ChristoffSchmitz » 30 May 2018, 09:46

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.
ChristoffSchmitz
 
Posts: 11
Joined: 20 Aug 2013, 09:54

Re: Postprocessing Wizard Webservices

Postby ckuhl » 01 Jun 2018, 10:23

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
ckuhl
 
Posts: 6
Joined: 01 Dec 2017, 18:22

Re: Postprocessing Wizard Webservices

Postby KaiBaechle » 01 Jun 2018, 15:56

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())
KaiBaechle
 
Posts: 33
Joined: 24 May 2013, 21:20


Return to RapidRep Designer



Who is online

Users browsing this forum: No registered users and 2 guests

cron