Hallo,
bisher habe ich erfolgreich mit den Komponenten "TRESTClient", "TRESTRequest" und "TRESTResponse" eine Restabfrage implementieren können. Ebenfalls eine Übermittlung von Nutzdaten, allerdings waren da alle Daten per "TRESTClient.Params.AddItem('data', s);" hinzugefügt. Nun soll ich Nutzdaten versenden die alle im Body stehen. Aber wenn ich die Daten versende, bekomme ich immer einen Fehler "Modul: REST-Anforderung fehlgeschlagen: Execution of request terminated with unknown error".
Die Komponenten:
Delphi-Quellcode:
object RESTClientMUCjson: TRESTClient
Accept = '
application/json, text/plain; q=0.9, text/html;q=0.8,'
AcceptCharset = '
UTF-8, *;q=0.8'
Params = <>
HandleRedirects = True
OnHTTPProtocolError = RESTClientMUCjsonHTTPProtocolError
Left = 48
Top = 320
end
object RESTRequestMUCjson: TRESTRequest
Client = RESTClientMUCjson
Method = rmPOST
Params = <
item
end>
Response = RESTResponseMUCjson
OnAfterExecute = RESTRequestMUCjsonAfterExecute
SynchronizedEvents = False
OnHTTPProtocolError = RESTRequestMUCjsonHTTPProtocolError
Left = 120
Top = 344
end
object RESTResponseMUCjson: TRESTResponse
ContentType = '
application/json'
Left = 200
Top = 320
end
Der Code (das ganze dient mir erst mal dazu mit fest codierten Werten überhaupt einen Datensatz übermitteln zu können, um das Prinzip zu verstehen):
Delphi-Quellcode:
function AddBodyStr(const aKey, aValue : string) : string;
{ Füge aKey, aValue dem Body hinzu
Beispiel:
rotationId=143982
Das Funktionsergebnis liefert einen String mit einem "/" am Ende, so kann man aus dem
Funktionsergbnis einen lesbaren Gesamtstring aller Bodies fürs loggen zusammen bauen. }
begin
Result := '';
if aValue <> '' then begin
Result := Format('%s=%s', [aKey, aValue]);
RESTRequestMUCjson.AddBody(Result, ctAPPLICATION_JSON);
Result := Result + '/';
end;
end;
rotationId := '143982';
orderId := '';
cleaningBegin := '2016-10-10T14:25:00.000+02:00';
cleaningEnd := '2016-10-10T14:55:00.000+02:00';
cleanerOnPosition := '2016-10-10T14:30:00.000+02:00';
orderType := 'QuickCleaning';
teamType := 'Maier';
specialInformation := 'Spezial';
RESTClientMUCjson.BaseURL := Format(edtBaseURL.Text, [rotationId]);
Body := '';
Body := Body + AddBodyStr('rotationId', rotationId);
Body := Body + AddBodyStr('orderId', orderId);
Body := Body + AddBodyStr('cleaningBegin', cleaningBegin);
Body := Body + AddBodyStr('cleaningEnd', cleaningEnd);
Body := Body + AddBodyStr('cleanerOnPosition', cleanerOnPosition);
Body := Body + AddBodyStr('orderType', orderType);
Body := Body + AddBodyStr('teamType', teamType);
Body := Body + AddBodyStr('specialInformation', specialInformation);
AddResults(RESTClientMUCjson.BaseURL); // protokolliere die BaseURL
AddResults(Body); // protokolliere die einzelnen Nutzdaten
try
RESTRequestMUCjson.Execute;
ergibt dann im Fehlerprotokoll:
[10.10.2016 13:26:59,561]
http://XXX/flight/143982/cleaningOrder
[10.10.2016 13:26:59,561] rotationId=143982/cleaningBegin=2016-10-10T14:25:00.000+02:00/cleaningEnd=2016-10-10T14:55:00.000+02:00/cleanerOnPosition=2016-10-10T14:30:00.000+02:00/orderType=QuickCleaning/teamType=Maier/specialInformation=Spezial/
[10.10.2016 13:31:47,912] Error: @@@
Modul: REST-Anforderung fehlgeschlagen: Execution of request terminated with unknown error
Wo liegt hier nun der Denkfehler?
a) ist "Method = rmPOST" OK?
b) ist das zusammen basteln des Body so OK?
c) ist das "ctAPPLICATION_JSON" im "AddBody" so OK?
d) in der Doku die uns zur Verfügung steht wird der Wert für "rotationId" als "integer" angegeben. Blöde frage, wie übergebe ich denn in diesem Fall explizit einen Integer? Letztlich kann ich doch ausschlielich strings übergeben.
Vielen Dank im Voraus.
Gruß, Markus