Da ich selber das Delphi REST-Framework nicht nuntze und das lieber alles selber mache, wie ich es benötige, kann ich hierzu nicht viel sagen. Allerdings müsste Delphi das als "/get/customer/Hans%20Meier" codieren, damit das richtig ist. Der Parameterteil muss allerdings ein + enthalten. Ob das Delphi REST Framework das hier korrekt macht, ist dann natürlich die Frage. Aus diesem Grund mache ich das lieber alles selber so wie es sein müsste und verzichte auf diese Klasse. Wenn du das mal testest, würde es mich schon intressieren was dabei rauskommt.
Jetzt war ich neugierig. Ich habe mein Programm etwas angepasst, da der Dienst doch auch die Möglichkeit bietet, beliebige URLs zu testen:
Delphi-Quellcode:
program restSpace2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, REST.Client, System.Net.HttpClient;
var
myRest: TRESTClient;
myQuery: TRESTRequest;
resultText:
string;
begin
myRest:=TRESTClient.Create('
https://httpbin.org/');
myQuery:=TRESTRequest.Create(
nil);
myQuery.Client:=myRest;
try
{ TODO -oUser -cConsole Main : Code hier einfügen }
myQuery.Resource:='
anything/hello world?param=hello world';
myQuery.Execute;
if (myQuery.Response.StatusCode=200)
and (myQuery.Response.JSONValue<>
nil)
then begin
resultText:=myQuery.Response.JSONValue.GetValue<
string>('
url','
!! Not found !!');
Writeln(resultText);
Readln;
end;
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
myQuery.Free;
myRest.Free;
end.
Liefert als Ausgabe vom Testserver:
Code:
https://httpbin.org/anything/hello world?param=hello%2520world
Das heißt: die Ressource wird korrekt codiert mit %20 und kommt daher auch korrekt beim Server an, nur der Parameter wird doppelt mit %2520 kodiert. Übrigens habe ich nach deinen Hinweisen noch mal etwas gegoogelt, weil mir das mit dem "+" nicht so klar war. Wenn ich das richtig verstehe, dann KANN man das "+" im
Query-Parameter nutzen, was zur einfachen Lesbarkeit dienen soll, man muss es aber nicht und kann weiterhin auch "%20" nutzen, weil das immer geht. So beim
W3C gelesen, die dann selber in Beispielen auch einen Parameter mit "%20" haben.
Für mich also folgende Erkenntnisse:
- Es ist alles nicht so dramatisch, wie ich im ersten Moment gedacht habe, als mein Programm direkt auf die Nase gefallen ist. Hier sollte ich an ein bis zwei Stellen wahrscheinlich auch mal im Code ran und das sauberer programmieren.
- Die doppelte Kodierung von Query-Parametern mit den Ergebnis "%2520" ist aber dennoch falsch, selbst wenn "?param=hello world" vielleicht nicht besonders schlau an der Stelle ist.
- Ich habe jetzt eine bessere Grundlage, um einen Eintrag fürs QP zu machen.