[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Thema: IWS und Body

Hybrid View

  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.120

    IWS und Body

    Hallo,

    ich kämpfe immer noch mit der Implementierung eines Webservices mittels des IWS auf der i.

    Der Assistent ist eigentlich ganz gut. Es ist mir auch gelungen, ein Serviceprogramm und ein normales ILE-RPG-Programm per Webservice zur Verfügung zu stellen. (Achtung: Es werden nur Serviceprogramme mit maximal 7 Parametern unterstützt. Normale Programme werden mit mehr Parametern (ich glaube 254), unterstützt).

    Eine normale GET-Abfrage kann problemlos implementiert werden. Man definiert im Programm einfach alle Input- und Output-Parameter und der IWS kümmert sich darum, dass der Output in JSON eingepackt wird.

    Bestimmte "Transportmetadaten", wie QUERY_STRING, REQUEST_METHOD usw. kann man im IWS-Wizzard ankreuzen und bekommt sie dann im Job als Environment-Variablen zur Verfügung gestellt. Alles sehr schön.

    Aber ich frage mich, wie ich eine POST-Methode verarbeiten soll. Dabei werden die Daten ja nicht in der URL, sondern im Body übergeben (denke ich). Weiß jemand, wie der Body der Webservice-Anfrage ins RPG-Programm kommt? Bzw. wie kann sich das RPG-Programm den Body holen? Ich habe da im IWS-Wizzard nichts gefunden.

    Dieter

  2. #2
    Registriert seit
    Apr 2019
    Beiträge
    43
    Das gibst du im IWS an. Da gibst du das Service Programm an und die jeweiligen Parameter. Die Daten übergibst du als json object.
    Du machst den Post mit dem json object im Body und gibst da ja dann an { "param1":"Blabla", "param2":"blabla2"}
    Dein Service Programm hat param1 und param2 als Input Felder.

  3. #3
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Hallo xenofob,


    danke für deine Antwort. Mir ist eines noch nicht ganz klar: Wenn ich das Programm oder Serviceprogramm im IWS angebe, ermittelt der IWS ja automatisch die Parameter des Programms. Wenn ich zusätzlich zu dem Body noch Path-Parameter mitgeben möchte, muss ich diese im IWS-Wizzard ja den Input Parametern des Programms zuordnen:

    Im folgenden Beispiel (ist allerdings ein GET) ordne ich den Path-Parameter "PKNR" dem Input-Parameter "I#_PKNR" des Programms zu. Als Eingabequelle habe ich *PATH_PARAM ausgewählt.
    Click image for larger version. 

Name:	PKNR.PNG 
Views:	17 
Size:	27,3 KB 
ID:	581

    Wenn ich mir die Möglichkeiten der Eingabequelle ansehe, finde ich da nichts, was namensmäßig auf Body hindeutet:
    Click image for larger version. 

Name:	arten.PNG 
Views:	4 
Size:	14,5 KB 
ID:	582

    Es wäre für klar, wenn es da die Auswahl *BODY gäbe und ich diese Auswahl dann dem passenden Programmparameter zuordnen könnte.

    Vielleicht habe ich ja auch nur ein Brett vor dem Kopf und sehe den Wald vor lauter Bäumen nicht.

    Ich werde auf jeden Fall weiter testen. Vielleicht ergibt sich das ja alles noch.

    Gruß,
    Dieter

  4. #4
    Registriert seit
    Jan 2007
    Beiträge
    905
    Dieter,
    hast Du dich auch mal beschäftigt, ob du evtl. die Webservices auch via SQL lösen könntest? Birgitta hat diesbezüglich an der Power einen interessanten Vortrag gehalten. Das PP-PDF mit HowTo und Beispiel ist verfügbar.

    Nachtrag Download Link: https://bit.ly/3eTus9w
    kf

  5. #5
    Registriert seit
    Apr 2019
    Beiträge
    43
    Zitat Zitat von camouflage Beitrag anzeigen
    Dieter,
    hast Du dich auch mal beschäftigt, ob du evtl. die Webservices auch via SQL lösen könntest? Birgitta hat diesbezüglich an der Power einen interessanten Vortrag gehalten. Das PP-PDF mit HowTo und Beispiel ist verfügbar.
    Ja genau, es gibt auch SQL via Rest als Webservices. Sehr empfehlenswert. Äußerst schnell und easy to install . 1 MB Daten im Json format in unter 300 ms!!

  6. #6
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Vielen Dank für Eure Antworten.

    Ja, SQL haben wir bereits ausprobiert und grundsätzlich funktioniert es. Bisher ist es uns allerdings nur gelungen, eine "flache" JSON-Liste herauszubekommen. Komplexe JSON-Objekte kann man wohl nicht mit SQL machen, oder? Ich dachte, man könnte vielleicht mit JSON_OBJECT usw. selber ein JSON-Objekt bauen und dann zurückgeben. Hat aber bisher nicht geklappt. Der IWS hält das JSON-Object einfach für einen String und escaped die Klammern.

    Auch nochmal herzlichen Dank an xenofob. Deine Aussagen zum IWS und den Beschränkungen bei den Parametern war genau das, was mir unklar war.

    @Rainer: Wird würden natürlich gerne so viel wie möglich standardisiert machen. Wenn uns der IWS nicht reicht, gucken wir uns gerne deine Lib an. (Das du hochklassige Software schreiben kannst, hast du bei uns ja bereits bewiesen!).

    Tja, dann mache ich mal weiter. Nochmals danke an alle.

    Dieter

  7. #7
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von dschroeder Beitrag anzeigen
    Ja, SQL haben wir bereits ausprobiert und grundsätzlich funktioniert es. Bisher ist es uns allerdings nur gelungen, eine "flache" JSON-Liste herauszubekommen. Komplexe JSON-Objekte kann man wohl nicht mit SQL machen, oder? Ich dachte, man könnte vielleicht mit JSON_OBJECT usw. selber ein JSON-Objekt bauen und dann zurückgeben. Hat aber bisher nicht geklappt. Der IWS hält das JSON-Object einfach für einen String und escaped die Klammern.
    Hallo Dieter, du kannst mit den JSON Aggregationsfunktionen auch komplexe JSON Daten erzeugen. Ähnlich wie mit den XML Funktionen in SQL.

    lg Andreas

  8. #8
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Hallo Dieter, du kannst mit den JSON Aggregationsfunktionen auch komplexe JSON Daten erzeugen. Ähnlich wie mit den XML Funktionen in SQL.


    Natürlich kann man
    Du musst lediglich mit mehreren Common Table Expressions arbeiten.
    Zuerst selektierst Du die Rohdaten und dann fängst Du an das JSON Dokument ausgehend vom untersten Level aus aufzubauen.
    OK, ich habe verstanden, dass man auch komplexe JSON-Objekte mit SQL erstellen kann. Aber wir haben noch folgendes Problem: Wenn wir in einem IWS Webservice als Ausgabeart *JSON auswählen und dann ein (komplexes) JSON mittels SQL-Funktionen erstellen, packt der IWS das ganze, bereits fertige JSON, nochmal in ein JSON. Und dabei escaped er das von uns erstellte "innere" JSON. Wir finden da einfach keine Lösung.

    Kann man dem IWS sagen, dass einfach nur "plain Text" herauskommen soll? Oder kann man angeben, dass das, was man zurückgibt, bereits JSON ist und er das nicht nochmal in JSON umbauen soll?

    Vielleicht sehen wir den Wald vor lauter Bäumen nicht. Vielleicht nochmal zur Klarstellung, was ich meine:

    Wenn man einen SQL-Webservice mit JSON-Ausgabeart definiert und ganz normale SQL-Ergebnisse (also in der Regel Datenbankfelder) zurückliefert, dann packt der IWS das Ergebnis richtig schön in JSON sein und gibt lupenreines JSON als Response zurück.

    Aber wenn unser SQL selber schon JSON zusammenbaut (eben mit den SQL-JSON-Funktionen), dann packt der IWS das bereits fertige JSON nochmal in JSON ein. Der IWS kann auch gar nicht wissen, dass das SQL bereits ein gültiges JSON liefert, denke ich. Deshalb hält er das JSON für einen String und escaped alles und macht schließlich geschweifte Klammern drum.

    Bin für jede Hilfe dankbar.

    Dieter

  9. #9
    Registriert seit
    Apr 2019
    Beiträge
    43
    Hallo Dieter,

    soweit mir bekannt, ist plaintext als Rückgabe nicht möglich. (Was ja auch verständlich ist..)
    Entweder man lebt damit (json in nem json) oder greift auf alternativen zurück.
    Scott Klemens hat ein kleines Tutorial erstellt, wie man einen eigenen Webserver aufsetzt und den Webserver programmieren kann. Wenn es dir nur darum geht plaintext durchzureichen, könntest du leicht den Server selber erstellen. Soll nicht Mal so schwer sein
    (Ein eigenentwickelter Webserver könnte komplexe json auch selbst generieren, nur so als Input für dich)

  10. #10
    Registriert seit
    Feb 2017
    Beiträge
    43
    Hallo,

    so wie xenofob das beschreibt, verfahren wir auch bei uns.
    Wir haben auf der i einen Apache Webserver in Kombination mit PHP am laufen, sind seit einigen Wochen auch vom Zend Server auf das Open Source PHP per yum rpm produktiv unterwegs.
    Alle Webservices die wir anbieten, implementieren wir in PHP und haben so alle Freiheiten in der Gestaltung unserer Webservices.
    Alternativ zu PHP bietet sich noch node.js auf der i an.

    Gruß,
    Manuel

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von dschroeder Beitrag anzeigen
    Vielen Dank für Eure Antworten.

    Komplexe JSON-Objekte kann man wohl nicht mit SQL machen, oder?
    Natürlich kann man
    Du musst lediglich mit mehreren Common Table Expressions arbeiten.
    Zuerst selektierst Du die Rohdaten und dann fängst Du an das JSON Dokument ausgehend vom untersten Level aus aufzubauen.
    Das folgende JSON-Dokument ist mit SQL erstellt.

    Click image for larger version. 

Name:	Annotation 2020-07-23 184827.jpg 
Views:	27 
Size:	76,3 KB 
ID:	583
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  12. #12
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Hallo Birgitta, hallo Andreas,

    herzlichen Dank. Das bringt uns auf die richtige Spur, denke ich !

    Viele Grüße,
    Dieter

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •