Anmelden

View Full Version : SYSTOOLS.URLENCODE



KM
24-04-17, 15:35
Hallo,

ich habe gerade ein Problem beim SYSTOOLS.URLENCODE festgestellt, wenn in meiner URL Leerzeichen vorkommen. Hier ist ein Beispiel:


SELECT *
FROM XMLTABLE('$doc/hibcData'
PASSING
XMLPARSE(DOCUMENT SYSTOOLS.HTTPGETCLOB
('http://ban:8080/webservices/hibc/code1/' concat systools.urlencode('+DIVO6676681', 'UTF-8') concat '/code2/' concat systools.urlencode('+$$3191208W00158 C', 'UTF-8'), ''))
AS "doc"
COLUMNS
Lic VARCHAR(4) PATH 'lic',
ProdNumber VARCHAR(18) PATH 'productNumber',
ExpDate VARCHAR(8) PATH 'expiryDate',
Lot VARCHAR(18) PATH 'lotNumber',
Serial VARCHAR(18) PATH 'serialNumber',
ProdDate VARCHAR(8) PATH 'productionDate',
Unit VARCHAR(1) PATH 'unit',
Quantity VARCHAR(5) PATH 'quantity'
) AS WebServiceResult;


Ich übergebe meinem REST-Webservice hier 2 Parameter (CODE1 und CODE2 mit den jeweiligen Werten). In CODE2 ist ein Leerzeichen vorhanden. Jetzt hätte ich eigentlich erwartet, dass dieses Leerzeichen in "%20" encodiert wird. Es wird aber in ein "+" encodiert und somit im Webservice als normales Pluszeichen interpretiert anstatt als Leerzeichen.

Wie kann ich dieses Problem umgehen? In anderen Sprachen gibt es z.B. urlencode() für "+" und rawurlencode() für "%20".

Gruß,
KM

Fuerchau
24-04-17, 15:58
Die Frage ist, wann ist es ein Parameter, wann gehört es zum Pfad.
Ich denke urlencode sollte es korrekt machen, wenn du den gesamten String übergibst.
Also deine Parameter sind eigentlich Pfadangaben.

Korrekt wäre also alles in ein concat und dann an urlencode übergeben.

Diskussion siehe hier:
http://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20

KM
25-04-17, 09:28
Ich habe jetzt herausgefunden, dass die Funktion SYSTOOLS.URLENCODE intern die Java-Klasse "java.net.URLEncoder" verwendet und diese encodiert das Leerzeichen eben in ein "+".

Als Workaround wird hier empfohlen nach dem URLENCODE noch einen REPLACE von "+" nach "%20" durchzuführen.

Damit funktioniert's nun.

Gruß,
KM

Fuerchau
25-04-17, 09:39
Das funktioniert aber nur, wenn ein echtes "+" ggf. in %2B umgesetzt wurde.

KM
25-04-17, 09:44
Das funktioniert aber nur, wenn ein echtes "+" ggf. in %2B umgesetzt wurde.

Deshalb hatte ich ja geschrieben, dass der REPLACE erst nach dem URLENCODE durchgeführt werden darf. Dann ist das "+" ja bereits umgesetzt.

Gruß,
KM