Anmelden

View Full Version : Probleme mit Webservice und HTTP API



Seiten : 1 [2] 3 4

Fuerchau
07-03-17, 14:44
Nach der Ausgabe der Datei musst du per CHGATR-Kommando die CCSID der IFS-Datei auf 1208 setzen. Dann sollte es automatisch klappen.
Das Problem ist, dass wohl der Parser sich für die "processingoptions" des XML nicht interessiert sondern auf die CCSID der IFS-Datei geht.
Ansonsten ist der CCSID-Parameter wohl für die Ausgabe und nicht die Eingabe relevant.

ncc1701e
07-03-17, 15:03
Nach der Ausgabe der Datei musst du per CHGATR-Kommando die CCSID der IFS-Datei auf 1208 setzen. Dann sollte es automatisch klappen.
Das Problem ist, dass wohl der Parser sich für die "processingoptions" des XML nicht interessiert sondern auf die CCSID der IFS-Datei geht.
Ansonsten ist der CCSID-Parameter wohl für die Ausgabe und nicht die Eingabe relevant.

Dies klappt bei mir leider nicht, habe nach dem erstellen der XML den Befehl per ExecuteCMD in RPG einmal abgesetzt und dies bewirkt nichts, der username steht noch immer wie vorher dort drin.
Ich verstehe ehrlich gesagt auch nicht warum das was hätte bringen sollen, die CCSID ist doch schon beim erstellen 1208(sagt jedenfalls wrklnk/rdi).

Ich habe mir die XML jetzt einmal per Rdi auf meinen Desktop geschoben und mittels notepad++ geöffnet. Dort wird mir der username korrekt angezeigt, mit 'testüser' statt 'testüser'.

Irgendetwas scheine ich nicht zu verstehen, für mich gibt das ganze gerade keinen Sinn, wenn die Datei CCSID 1208 hat,also UTF-8, warum kann dann dieser dumme Umlaut nicht angezeigt werden...

Fuerchau
07-03-17, 15:15
'testüser' ist die einfach 1:1-Übersetzung des XML-Inhaltes in EBCDIC.
'ü' ist die UTF-8-Entsprechung des 'ü'.
D.h., dass der XML-INTO keine Übersetzung von 1208 in EBCDIC (z.B. 273) durchführt.
Schau dir die XML mal mit WRKLNK im Hex-Mode an, dann solltest du die ASCII-Entsprechung der 2 Zeichen sehen können.
Wenn die XML-Datei bereits 1208 hat, dann ist das ja auch korrekt.
Jetzt ist nur die Frage, warum die Übersetzung in 273 nicht klappt.

Gib mal CCSID=UCS2 an.
Dann sollte der XML-Into eigentlich von UTF-8 in UCS2 umwandeln und dann in deine SBCS-Felder wieder in die JOB-CCSID z.B. 273.
Ansonsten definiere die Felder mal als UCS2-Felder.

ncc1701e
07-03-17, 15:49
Schau dir die XML mal mit WRKLNK im Hex-Mode an, dann solltest du die ASCII-Entsprechung der 2 Zeichen sehen können.


Magst du mir verraten wie ich dies tun kann, 'wrklnk' + F4 zeigt keine Option für HEX und wenn ich mit 5 mir die Datei anzeigen lasse, scheint es auch keine Option zu geben.



Gib mal CCSID=UCS2 an.
Dann sollte der XML-Into eigentlich von UTF-8 in UCS2 umwandeln und dann in deine SBCS-Felder wieder in die JOB-CCSID z.B. 273.


Habe ich gemacht, hat nichts gebracht, der Username ist immernoch inkorrekt.
Ich kann dir leider gerade nicht folgen, welches Feld soll ich als ucs2 definieren?

Fuerchau
07-03-17, 16:06
Die DS WebserviceRequest. Hier sind die Felder alle als SBCS definiert, also einfacher Zeichensatz.
Allerdings weiß ich nicht, wie im Full-Free ein UCS2-Feld definiert wird, im alten Format ist das Feld-Typ "C".
Zur Weiterverarbeitung der Daten ist dann ggf. von dir ein %char (UCS2->SBCS) oder %ucs2 (SBCS->UCS2) einzubauen.

Hex-Anzeige:
WKRLINK, Auswahl 5, F10 (Steht am unteren Bildschirmrand).

Nachtrag:
Bei meinem letzten XML-INTO gebe ich auch keine CCSID an:
XMLOption = ' trim=all' // Leerzeichen am Anfang/Ende
+ ' allowmissing=yes' // fehlende Knoten ignorieren
+ ' allowextra=yes' // zusätzliche Knoten ignorieren
+ ' countprefix=cnt' // Zählervariable für Arrays
+ ' case=convert' // ungültige Zeichen in "_" konvertieren
+ ' doc=file' // XML aus Datei lesen
;
und es funktioniert.
Dann habe ich nur noch die Vermutung, dass dein Job auf CCSID 65535 (*HEX) steht. Dann funktioniert das wohl auch nicht korrekt.

ncc1701e
07-03-17, 16:14
Ah ok, das kann ich anscheinend einfach mit ucs2(länge) machen, also quasi wie bei char.
Werde das dann mit WRKLNK morgen einmal testen, muss gleich Feierabend machen.

Hier sonst enmal der plain xml string, welcher als response zurückkommt: Link (http://pastebin.com/kzLNiPxL)


Ich danke euch allen dann definitv für die heutige Hilfe, hoffentlich finden wir morgen dann eine Lösung : )

Allen ein schönen Feierabend.

Fuerchau
07-03-17, 16:22
Der Response ist da schon zumindest im hinteren Teil UTF-8. Die %XX-Werte sind nicht UTF-8 sonder nur (einfacher) HTML-Code.
Wichtig ist, dass die IFS-Datei die CCSID 1208 aufweist, was du über WRKLNK und dann "Anzeige Attribute" prüfen kannst.

ncc1701e
08-03-17, 08:18
Morgen,

die CCSIDs der XML Dateien ist 1208. Die XML wird bereits mit dieser CCSID erstellt.

Wenn ich mit chgjob + F4 reingehe sehe ich folgende Sprachattribute:


Sprachen-ID . . . . . . . . . . LANGID DEU
Landes- oder Regions-ID . . . . CNTRYID DE
Zeichensatz-ID . . . . . . . . . CCSID 273


Das temporäre ändern auf die CCSID 1141 wie auf der vorigen Seiten beschrieben brachte leider auch keine Lösung...

Wie sieht es denn aus wenn einer von euch den XML Response einmal einließt, könnte man das Problem dann nicht eventuell weiter eingrenzen? Dafür muss ja eigentlich nur die Webservice DS, XMLOPTIONS und das XML INTO aus meinem geteilten Quellcodeausschnitt genommen und compiliert werden. Den Pfad zur XML kann man dann ja selber hinterlegen.

Wäre dazu jemand bereit?

EDIT: Eben auch per WRKLNK mir die HEX Werte angeschaut da steht dann auch wie du bereits gemeint hast C2BC drinn für die beiden Zeichen(ü).

Fuerchau
08-03-17, 08:54
Nun, wenn man sucht wird man fündig:
http://www.code400.com/forum/forum/iseries-programming-languages/rpg-rpgle/13641-xml-sax-with-an-utf-8-string

So, wie es aussieht, wird beim XML-Into UTF-8 native gar nicht unterstützt.
"The following Unicode CCSIDs are supported: 1200, 13488, 17584."

Du brauchst dich also nicht weiter zu bemühen.
Was du nun also brauchst ist eine Konvertierung an anderer Stelle.

Hierzu musst du deinen SQL modifizieren:

Ggf. benötigst du auch einen Doppelcast, da ich nicht weiß, was denn die SQL-Funktion als CCSID-Typ zurückgibt.

cast(cast(cast(systools.httpgetclob(...) as blob) as clob(1M, 1208)) as clob(1M, 1200))

Somit solltest du die XML-Datei dann als UTF-16 (CCSID 1200) erstellt haben, was vom XML-Into unterstützt wird.
Statt clob(1M, 1200) funktioniert ggf. auch NCLOB.

Alternativ kannst du auch per QSH den Befehl "iconv" aufrufen. Mit diesem kannst du die IFS-Datei in eine andere CCSID konvertieren.

Bleibt halt nur die Frage offen, warum die IBM die 1208 nicht unterstützt. Ggf. ab V7R3ff?

Rainer Ross
08-03-17, 09:21
Schick mir bitte die xml Datei per Mail, dann schaue ich mir das auf meinem System an

rainer_ross@web.de