Ich bin dazu übergegangen, alles in eine
DLL (gebaut mit Delphi Berlin Update 2) zu packen und nach draußen zur EXE hin mit
COM-Interfaces zu arbeiten.
Intern wird dann anhand der übergebenen Parameter unterschieden, ob es zu einen lokalen Dienst geht und mit
SOAP und dem Import der
WSDL gearbeitet wird ODER ob ich per REST-Komponenten und JSON arbeite.
Was mich ewig aufgehalten hat, war das automatische kodieren der Parameter. Das habe ich auch nur per Fiddler raus gefunden.
Beim Anlegen der Header am REST-Request kann man aber sagen, das nicht kodiert werden soll.
Hier ein Quellcode-Schnipsel dazu:
Delphi-Quellcode:
procedure TCloudPOS.InitRestComponents;
var
Param: TRESTRequestParameter;
begin
FRESTClient := TRESTClient.Create(
nil);
FRESTClient.Accept := '
application/json, text/plain; q=0.9, text/html;q=0.8,';
FRESTClient.AcceptCharset := '
UTF-8, *;q=0.8';
FRESTClient.ContentType := '
application/json';
FRESTClient.HandleRedirects := True;
FRESTClient.SynchronizedEvents := False;
FRESTRequest := TRESTRequest.Create(
nil);
FRESTRequest.Client := FRESTClient;
FRESTRequest.Method := rmPOST;
Param := FRESTRequest.Params.AddHeader('
accesstoken', FAccessToken);
Param.Options := Param.Options + [TRESTRequestParameterOption.poDoNotEncode];
// <--- das hier ist der Trick!
Param := FRESTRequest.Params.AddHeader('
cashboxid', FCashBoxId);
Param.Options := Param.Options + [TRESTRequestParameterOption.poDoNotEncode];
// <--- das hier ist der Trick!
FRESTResponse := TRESTResponse.Create(
nil);
FRESTRequest.Response := FRESTResponse;
end;
Und natürlich die Delphi-Implementierung des JSON-Serialisieres für leere Arrays, das war auch nochmal so ein Ding für 100 graue Haare mehr:
http://www.delphipraxis.net/191908-r...yn-arrays.html