PDA

View Full Version : Rest Anfrage und Json return



Seiten : [1] 2

Robi
07-12-18, 09:39
Moin *all
für eine neue Schnittstelle muß ich eine REST anfrage machen und ich bekomme Daten im Json Format zurück.
Da es bisher kein Beispiel (vom Schnittstellenanbieter) gibt, wie gehen wir vor?

1. wir bilden je AnfrageTyp den String mit der URL, den wir später mit HttpGetClob 'weggeben'

eval URL = 'HTTP://' + %trim(Servername) + ':80' + '/XX/GetNotiz/{notizId}'

Frage: Muß ich die notizId in der geschweiften Klammer weggeben oder ist das eine Syntax um eine Variable darzustellen?

Dann bekomme ich ein Json zurück

Definiere ich da eine DS die dann gefüllt ist?
Passiert da eine Typ / Größenprüfung
Was geschied, wenn ich eine Variable 50A Definiere aber 55 Byte kommen?
Abbruch oder abgeschnitten?
Muß ich eine DIM oder eine OCCUR Tabelle definieren, wenn der Aufruf mehrere 'Datensätze'
zurück liefert. Auch hier... was geschied, wenn die Tabelle nicht groß genug ist?

Oder definiere ich nur einen großen String, den ich später selber auslese

Es kommen teilweise 150 Felder zurück, von dehnen ich 2 der 3 verwenden muß

Danke
Robi

Fuerchau
07-12-18, 10:57
Wie würde Birgitta nun antworten?
Nimm doch einfach mal SQL:

https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/sqlp/rbafyjson.htm

Funktioniert im Prinzip nicht anders als XML:

https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/sqlp/rbafyjsontable.htm

Robi
07-12-18, 11:29
???
Das will ich doch ...
http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/20854-https-aufrufen

daher doch die Fragen!
irgendwo anders wurde ein Json in eine DS eingelesen

Fuerchau
07-12-18, 12:24
Den ermittelten CLOB übergibst du dann an den JSON_TABLE mit der Definition des Pfades und der Knoten. Die Typisierung kommt durch die Spaltendefinition, so dass Werte gecasted werden.
Du bekommst natürlich nur eine relationale Sicht der Daten, aber du kannst ja die Ebene mit Mehrfachvorkommen auswählen und per "../"-Notation auf übergeordnete Pfade zugreifen.

Robi
07-12-18, 15:09
Gibt es irgendwo ein Beispiel ohne FREE
Der SEU nervt wenn ich Free verwende.
Und beim Umsetzen Free / nicht free mach ich auch immer Fehler bei den datenstrukturen

Da wäre was zum abgucken hilfreich.

Robi
07-12-18, 16:12
Fragen zu diesem Beispiel, das ich im netz gefunden und abgeschrieben habe
(es funktioniert)

**free
dcl-s json sqltype(clob:32767);
dcl-s wid varchar(10);
dcl-s wnom varchar(10);
dcl-s wtel char(12);
JSON_data='{ +
"id" : 901, +
"name" : { "first":"John", "last":"Doe" }, +
"phones" : [{"type":"home", "number":"555-3762"}, +
{"type":"work", "number":"555-7252"} +
] +
}';

json_len = %len(%trimr(json_data));
EXEC SQL
select id, last, tel into :wid, :wnom, :wtel
from JSON_TABLE(:json, '$'
COLUMNS( id VARCHAR(10) PATH '$.id',
first VARCHAR(10) PATH '$.name.first',
last VARCHAR(10) PATH '$.name.last',
tel CHAR(12) PATH 'lax $.phones[0].number')
) AS X;

dsply (wid +'-' + wnom);

*INLR=*ON;

Fragen:
JSON ist als Clob definiert
JSON_Len ist gar nicht definiert --> ist also eine reserviertes Wort?
JSON_Data ist definiert und enthällt die Daten, der SELECT geht aber auf JSON_TABLE(:JSON, --> Also ist DATA auch ein fester Wert, der zu der eigendlichen Variable gehört?

Wenn ich mit HTTPGETCLOB die Daten in das CLOB MyClob Feld lese, was ist dan mit einem MyClob_DATA ? Wie sieht dann der Befehl aus?

andreaspr@aon.at
08-12-18, 07:09
Hi Robi,

Im Debugger oder auch im Spool müsstest du sehen, dass der Precompiler aus der definition JSON eine DS macht mit 2 Unterfelder (JSON_LEN + JSON_DATA).
Das gleiche hast du auch wenn du Strings Pointer in RPG definierst. In Data stehen die Werte und in LEN wie lang der "Pointer" ist.

Du könntest auch mit SQL eine Globale CLOB Variable erstellen die du mit:
exec sql Set :myClob ...
befüllst und im SELECT auch direkt verwendest.

lg Andreas

Robi
10-12-18, 11:08
Ja, danke
CLOB ist das Stichwort, JSON ist nur ein x-beliebiger Name (da hab ich wohl den Wald vor lauter Bäumen nicht gesehen)

Trotzdem krieg ich irgendwie die Kurve nicht

1. Wenn ich den Clob eingelesen habe und dieser mehrere 'Sätze' enthällt
- kann ich den mit prepare und fetch 'durch' lesen?
- Wenn er (beim Einlesen) 'überläuft', habe ich dann einen Abbruch im httpgetclob oder den letzten Satz nur zur Hälfte? Letzteres wäre ja kein Problem
- Wie setze ich JSON_len, wenn im Clob mehrere 'Sätze' sind die unterschiedlich lang sind, die 'Satzlänge'
weis ich doch erst, wenn ich die Daten gelesen habe.

ggf denke ich z.zt. etwas kompliziert.
Clob kenn ich nur aus einer Funktion mit der wir PDF in der DB Speichern und vorholen, JSON und REST sind Neuland.

Danke

Fuerchau
10-12-18, 12:08
Der CLOB muss in der Größe der max. Datenlänge definiert sein (z.B. 10M, 1G).
Dieser wird dann durch den Request komplett gefüllt.
Ist der CLOB zu klein, gibts (wie immer) was auf die Finger.
Nun gibst du diese Variable ja an die Table-Function und mit Fetch liest du nun alle Zeilen nach und nach aus, so wie mit normalen Tabellen eben auch.

Robi
10-12-18, 12:48
OK, Danke

was auf die Finger. bedeutet wohl Abbruch. Also groß genung definieren!

lt. Beispiel bekomme ich ggf soetwas zurück
"DatumBezahlung":null

Interpretiert das JSOB_TABLE lesen dieses null und ich kan mit den null Indikatoren beim einlesen arbeiten
oder muß ich alle Werte die null werden können Alpha definieren und selber basteln?

und lt. Text Dokumentation kommt etwas wie
"Betrag":10.00 also Punkt statt Komma.

'Kann' JSON_Table das, weil es in der Nicht AS/400 Welt 'normal' ist oder was muß ich machen.