Danke für die Anregung, das nochmal zu testen. Der Fehler ist jetzt etwas schwieriger nachzuvollziehen als wahrscheinlich im ursprünglichen Bug-Report vom August. Er tritt jetzt nur noch auf, wenn man den Parameter selbst in die
URL mit reinschreibt und nicht mehr, wenn man ihn per "AddParameter" setzt. In D11.2 funktionierten allerdings beide Wege völlig fehlerlos und so sollte es auch weiterhin sein. Es gibt ja diverse Gründe, warum es mal vorkommen kann, dass man nicht AddParameter nutzt, sondern die
URL selbst zusammensetzt - in REST-APIs könnte es auch eine durch einen Call vorgegebene
URL sein, um weitere Ergebnisse abzurufen (macht die Graph
API von Microsoft zum Beispiel). Wäre blöd, wenn Delphi da reingrätscht.
Aber klar, so fällt der Fehler weniger auf.
Beispielprogramm:
Delphi-Quellcode:
program restSpace;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, REST.Client;
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:='
get?param=hello world';
myQuery.AddParameter('
param_added','
hello world');
myQuery.Execute;
if (myQuery.Response.StatusCode=200)
and (myQuery.Response.JSONValue<>
nil)
then begin
resultText:=myQuery.Response.JSONValue.GetValue<
string>('
args.param','
!! Not found !!');
Writeln(resultText);
resultText:=myQuery.Response.JSONValue.GetValue<
string>('
args.param_added','
!! Not found !!');
Writeln(resultText);
Readln;
end;
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
myQuery.Free;
myRest.Free;
end.
Ausgabe mit D11.2:
Ausgabe mit D12:
Code:
hello%20world
hello world
Tja, wie vorgehen?
Dein Code ist so falsch.
myQuery.Resource:='get?param=hello world';
Das darfst du nicht so machen. Du gibts hier eine ungültige
URL an. Korrekt wäre:
Delphi-Quellcode:
myQuery.Resource:='get?param=' + TNetEncoding.URL.EncodeForm('hello world');
Sollte deine Serveranwendung wirklich fälschlicherweise ein %20 benötigen, kannst du anstatt EncodeForm() einfach nur Encode() nutzen.
Ich vermutet der Fix für RSP-38522 ist somit schon richtig, allerdings müsste man nun im REST Teil eventuell auch noch was anpassen/Korrigieren. Wenn deine Resource aber Parameter entählt solltest du die Codierung vorzugsweise selber machen, damit du da die Kontrolle hast, was und wie du das codierst.