View Full Version : Probleme mit Webservice und HTTP API
Wie sieht das Ergebnis aus, wenn Du das SQL-Statement direkt (nicht innerhalb eines Programms) absetzt?
Falsche oder richtige Werte?
ggf. musst Du noch das Ergebnis noch decoden mit URLDECODE.
Wenn auch bei einer direkten Abfrage falsche Werte kommen, dann ist das ursprüngliche XML verwutzt.
SQL geht per Default von UTF-8 aus, kann aber auch andere CCSIDs verarbeiten. Das hängt jedoch von der QAQQINI bzw. dem Eintrag in Option SQL_XML_DATA_CCSID ab.
Birgitta
Guten Morgen,
wenn ich das ganze über strsql oder dbeaver laufen lassen ändert sich nichts am Ergebnis, der username wird genauso angezeigt wie im RPG Programm mit embedded SQL. Die QAQQINI hat folgenden Inhalt:
APPLY_REMOTE
PARALLEL_DEGREE
ASYNC_JOB_USAGE
QUERY_TIME_LIMIT
UDF_TIME_OUT
MESSAGES_DEBUG
PARAMETER_MARKER_CONVERSION
OPEN_CURSOR_THRESHOLD
OPEN_CURSOR_CLOSE_COUNT
OPTIMIZE_STATISTIC_LIMITATION
OPTIMIZATION_GOAL
FORCE_JOIN_ORDER
COMMITMENT_CONTROL_LOCK_LIMIT
REOPTIMIZE_ACCESS_PLAN
SQLSTANDARDS_MIXED_CONSTANT
SYSTEM_SQL_STATEMENT_CACHE
VISUAL_EXPLAIN_DIAGRAM
IGNORE_LIKE_REDUNDANT_SHIFTS
STAR_JOIN
SQL_SUPPRESS_WARNINGS
SQL_TRANSLATE_ASCII_TO_JOB
NORMALIZE_DATA
LOB_LOCATOR_THRESHOLD
Dann definiere die Hostvariablen und/oder die Column-Variablen doch mal mit CCSID 1208!!!
Habe ich beides schon versucht, hatte nur noch keine Zeit das zu schreiben. Wenn ich nur die DS Felder mit CCSID 1208 definiere passiert nichts, wenn ich nur die DB Felder mit CCSID 1208 definiere passiert nichts, mache ich es bei beiden passiert auch nichts.
Auch die DS Felder statt 1208 mit *UTF8 zu definieren brachte keine Lösung.
Ich habe jetzt einfach mal interaktiv das SQL ausgeführt und bei jedem Aufruf die CCSID geändert, ich habe jetzt alle CCSIDs durch die mir mit F4 bei CHGJOB beim Feld CCSID angezeigt werden. Keine CCSID führte zum Erfolg.
Wenn du Programmvariablen mit 1208/*UTF8 definierst, enthalten sie natürlich den 1208-Code.
Erst bei einer Übertragung in eine UCS2/SBCS-Variable wird dann implizit eine Codewandlung durchgeführt.
Wenn du Programmvariablen mit 1208/*UTF8 definierst, enthalten sie natürlich den 1208-Code.
Erst bei einer Übertragung in eine UCS2/SBCS-Variable wird dann implizit eine Codewandlung durchgeführt.
Das hat bei mir auch nicht geholfen. Die Umalute sind weiterhin nicht korrekt.
Ich habe jetzt eine Lösung gefunden, die gefällt mir zwar nicht sehr ist aber ersteinmal eine (Zwischen)Lösung:
//Berechtigung - API/Secret Key
http_xproc(HTTP_POINT_ADDL_HEADER:%paddr(AddHeader Data));
//Im ersten Aufruf müssen wir anhand des Usernamens die ID bekommen
myurl = 'http://prodportal01/Portal/api/v2/users?filter=';
query = 'username:' + %trim(username);
EXEC SQL SET :query = systools.urlencode(:query,'UTF-8');
myurl += query;
xmlPath = '/WebServices/GetUserData/' + %char(%timestamp())
+ '-' + %trim(username) + '_ID' + '.xml';
//Die Streamfile(XML) muss vorher erstellt werden, ansonsten gibt
//es Probleme mit der CCSID die wohl nicht richtig erkannt wird, dadurch
//werden auch keine Umlaute angezeigt
returnCode = open_(%trim(XmlPath) : O_CREAT + O_RDWR + O_CODEPAGE
+ O_TEXTDATA:S_IRWXU + S_IRWXG + S_IRWXO:1208);
returnCode = http_url_get(myurl:xmlPath);
if (returnCode <> 1);
return *off;
endif;
xml-into(e) WebserviceRequest %xml(xmlPath:'path=PagedListView'
+ 'ModelOfuserNcCATIYq/items/user' + ' ' + XMLOPTIONS);
Es scheint so zu sein das die XML Datei nicht mit der richtigen CCSID angelegt wird, obwohl unter Attribute die richtige steht. Sobald ich nämlich mittels IFS API vorher eine leere Datei in 1208 anlege oder eine Datei als Ziel für den Response angebe wo bereits Umlaute richtig angezeigt werden, gibt es keine Fehldarstellungen der Umlaute und alles ist so wie es sein sollte.
Warum dies so ist weiß ich nicht, aber momentan habe ich keine Zeit mehr mich mit der Fehlersuche zu beschäftigen. Es ist zwar unschön aber das Leben ist kein Ponyhof....
Nochmals danke für die Unterstützung und die Hilfe. Ich denke ich konnte eine Menge hieraus für die Zukunft mitnehmen.
Das hat ja nun mal die Funktion http_url_get in der Hand, wie denn mit CCSID's umgegangen wird.
Vielleicht musst du ja nur diese Routine bzgl. der Dateierstellung anpassen oder im Funktionsaufruf einen weiteren Parameter CCSID aufnehmen.
Das Hauptproblem mit den CCSID's ist, dass diese vor der Aktion bekannt sein muss, dann erfolgt eine systemseitige Codewandlung.
Außerdem gibt es auch unterschiedliche IFS-API's, jeweils mit oder eben auch ohne Codewandlung.
Eine nachträgliche Attributierung (CHGATR) ändert nicht den Codeinhalt sondern setzt halt nur das Flag.
Gib doch mal eine Fehlermeldung an Scott Klement. Vielleicht kennt der das Problem ja bereits.