PDA

View Full Version : httpPostBlobVerbose und negativer SQLCODE im SQLRPGLE



Seiten : [1] 2

manuel.marcos
01-10-20, 09:09
Hallo,

wir wollen die SQL httpPostBlobVerbose Funktion zum Upload von Dateien nutzen.
Mir ist nun aufgfallen, das wenn ich von der Gegenseite einen http Code ungleich 2xx zurückbekomme, ich auch einen SQL Fehler bekomme. Im interaktiven SQL sehe ich aber dennoch im Ergebnis den zurückgelieferten http Header. Im SQLRPGLE wird die Host Variable allerdings nicht gefüllt, wenn der SQL Befehl nicht erfolgreich war.

Gibt es eine Möglichkeit trotzdem an den zurückgelieferten Header zu kommen bzw. das füllen der Host Variablen zu erzwingen? Vielleicht eine SQL Option o.ä.?

Gruß,
Manuel

Fuerchau
01-10-20, 12:40
https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/rzajq/rzajqhttpoverview.htm

includeErrorMsg = true

sollte ggf. Informationen liefern.

andreaspr@aon.at
01-10-20, 12:48
Hallo Manuel,

wie seht denn dein SQL genau aus?
Es gibt einen Message-Part und einen Header-Part.
Der Header-Part sollte immer zurückgeliefert werden, wenn es vom Server einen Antwort gibt.

Du bekommst nur nichts zurück, wenn du versuchst auf einen Host zuzugreifen, der nicht existiert oder ein Timeout bekommst.

lg Andreas

manuel.marcos
01-10-20, 13:03
@Andreas:
Den Header Part bekomme ich auch zurück, allerdings nur wenn ich den SQL interaktiv im ACS ausführe. Aber auch im ACS sehe ich im Protokoll den SQL Fehler. Das Problem ist, das wenn ich einen negativen SQLCODE im RPG bekomme, meine Host Variablen nicht gefüllt werden.
Einen negativen SQLCODE bekomme ich sobald, der http code ungleich 2xx ist. Also z.B. auch wenn die Authentifizierung ungültig ist.
Das ist der Quellcode:
exec sql
select t.responseHttpHeader into :responseHttpHeader
from table(systools.httppostblobverbose(:url, :httpHeader, :blobFile)) t;
if (SQLCODE <> 0);
writeLog('postFile': '20':responseHttpHeader);
writeLog('postFile': '20':'httppostblobverbose() failed. SQLCODE: ' + %char(SQLCODE));
return *off;
endif;

Das ist übrigens die Message die ich im ACS neben dem Ergebnis sehe:
SQL State: 01H52 Vendor Code: 462 Message: [SQL0462] Prozedur oder benutzerdefinierte Funktion HTTPPOSTCLOBVERBOSE in SYSTOOLS hat einen SQLSTATE der Art Warnung zurückgegeben. Ursache . . . . : Ein SQLSTATE im Format 01xxx wurde von der Prozedur oder der benutzerdefinierten Funktion HTTPPOSTCLOBVERBOSE in SYSTOOLS (mit SPECIFIC NAME HTTPP00015) zusammen mit Nachrichtentext Server returned HTTP response code: 401 for URL: https://accounts.accesscontrol.windows.net/xxx/tokens/OAuth/2 zurückgegeben. Fehlerbeseitigung: Dem Benutzer muss die Bedeutung der Warnung klar sein. Den Datenbankadministrator oder den Autor der benutzerdefinierten Funktion oder Prozedur zu Rate ziehen. Statement ran successfully, with warnings

manuel.marcos
01-10-20, 13:18
@Fuerchau
includeErrorMsg ändert leider nichts am Ergebnis bzw. SQLCODE.

andreaspr@aon.at
01-10-20, 13:21
Ich muss gestehen, ich selbst führe das SQL immer im Zuge eines INSERT INTO aus.
Also
Insert Into ... from final table (select * from ...)
Dann hab ich den HTTP Header und die Response Message zusammen.
Durch die Tabelle kann man das ganze sehr gut tracken, was wann für ein Request übermittelt wurde (ich speichere mir auch die URL ab) und was ich als Antwort erhalten habe.
Da hab ich dann auch HTTP Error Codes 3xx, 4xx usw. drinnen stehen.

manuel.marcos
01-10-20, 13:29
Ja das hatte ich in einem anderen Beitrag von dir auch gelesen und werde ich dann wohl auch genauso machen.
Ich hatte nur die Hoffnung, das wenn so eine Funktion angeboten wird, ich auch ohne Umwege an das Ergebnis komme. Das ein http Code ungleich 2xx zurück kommt, ist ja nichts ungewöhnliches und sollte meiner Meinung nach nicht zu einem SQL Fehler/Warning führen.
Ich werd dafür mal ein RFE einstellen.

Danke & Gruß,
Manuel

Fuerchau
01-10-20, 13:30
Letzteres ist auch zu empfehlen.
Ich hatte auch ein Problem mit einer selbst gestrickten Table-Function.
Der "INSERT INTO .... select * from table (...)" lieferte auch eine Warnung, die an das Programm allerdings mit einem positiven SQLCODE gemeldet wurde.
Ein RUNSQLSTM kam sogar dann mit einem Fehler SQL9xxx (Systemfehler) zurück obwohl alles i.O. war.
Hier hilft tatsächlich nur ein Wrapper, da die Ausgabe ja unabhängig erstellt wurde.

Malte
19-10-20, 09:00
Hallo Manuel,

falls du das Problem noch hast, ich konnte das für mich wie folgt lösen

Im RPG einmal mit ifNull damit ich die null Werte verarbeiten kann
Exec Sql
SELECT IfNull(responseMsg, ''),
VarChar(IfNull(responseHttpHeader, ''), 1500)
INTO :zzCLOB, :ResponsHeader
FROM table(
SYSTOOLS.HTTPGETCLOBVerbose(:host, :Header)
) as Ws;

Die includeErrorMsg Option muss httpHeader als Atributt angegeben werden und nicht als Feld was ich vorher immer falsch gemacht hatte

<httpheader includeerrormsg="true"><header name="Content-Type" value="text/json;charset=UTF-8">
<httpHeader includeErrorMsg="true"> <header name="Content-Type" value="text/json;charset=UTF-8"/> </httpHeader>
</header><header name="Content-Type" value="text/json;charset=UTF-8"><header name="Content-Type" value="text/json;charset=UTF-8">ich hoffe das konnte dir helfen

MfG Malte</header></header></httpheader>

manuel.marcos
19-10-20, 11:24
Hallo Malte,

war jetzt eine Woche im Urlaub... Hatte am Freitag vorletzter Woche auch zum Test mein SQL ähnlich wie du es vorschlägst mal angepasst, hab anstelle von ifnull coalesce genommen.
Aber super, dann war das ja kein Zufall sondern scheinbar die Lösung um an den Header zu kommen.
Finde ich persönlich auch besser, da man sich die Zwischentabelle spart.

Danke für deinen Tipp.

Gruß,
Manuel