Einzelnen Beitrag anzeigen

Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: MultipartFormData und TRESTRequest

  Alt 27. Okt 2022, 08:30
Ok

Soll:
Code:
POST /api/derEndpunkt?QueryParameter=1234 HTTP/1.1
Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=--------102722082331395
Accept: application/json, application/*+json
Accept-Charset: UTF-8, *;q=0.8
Authorization: Basic cm9vdDpvcHRpbWFs
Cookie: JSESSIONID=CACA72D331F84414ADF4E7C8CFFE02C2
User-Agent: Embarcadero RESTClient/1.0
Content-Length: 9121
Host: zielhost

----------102722082331395
Content-Disposition: form-data; name="nameJson"
Content-Type: application/json
Content-Transfer-Encoding: quoted-printable

{"key":"value"}
----------102722082331395
Content-Disposition: form-data; name="nameFile"; filename="Test_Bild.png"
Content-Type: image/png
Content-Transfer-Encoding: binary

[das serialisierte Bild]
----------102722082331395--

Was ich mache:
Delphi-Quellcode:
procedure PostObject;
begin
  FRestRequest.Params.Clear;
  FRestRequest.ClearBody;
  FRestRequest.Response.ResetToDefaults;
  FRestRequest.Method := rmPOST;
  FRestRequest.Resource := '/api/derEndpunkt?QueryParameter=1234';

  //Variante 1
  //FRestRequest.AddParameter('nameJson', '{"key":"value"}', false);

  //Variante 2
  //FRestRequest.AddParameter('nameJson', '{"key":"value"}', TRESTRequestParameterKind.pkREQUESTBODY);
  //FRestRequest.Params.ParameterByName('nameJson').ContentType := TRESTContentType.ctAPPLICATION_JSON;

  //Variante 3
  FRestRequest.Params.AddItem('nameJson', '{"key":"value"}', TRESTRequestParameterKind.pkREQUESTBODY, [], TRESTContentType.ctAPPLICATION_JSON);

  //Variante 4
  //FRestRequest.Body.Add('{"key":"value"}',TRESTContentType.ctAPPLICATION_JSON);

  FRestRequest.AddFile('nameFile', 'PfadZurPng', TRESTContentType.ctIMAGE_PNG);

  FRestRequest.Accept := 'application/json, application/*+json';
  FRestRequest.Execute;
end;
Varianten 1, 2 und 3 führen allen zum gleichen Ergebnis:
Code:
POST /api/derEndpunkt?QueryParameter=1234 HTTP/1.1
Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=--------102722082331395
Accept: application/json, application/*+json
Accept-Charset: UTF-8, *;q=0.8
Authorization: Basic cm9vdDpvcHRpbWFs
Cookie: JSESSIONID=CACA72D331F84414ADF4E7C8CFFE02C2
User-Agent: Embarcadero RESTClient/1.0
Content-Length: 9121
Host: zielhost

----------102722082331395
Content-Disposition: form-data; name="nameJson"
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable

{"key":"value"}
----------102722082331395
Content-Disposition: form-data; name="nameFile"; filename="Test_Bild.png"
Content-Type: image/png
Content-Transfer-Encoding: binary

[das serialisierte Bild]
----------102722082331395--
Der Content-Type des Json Parts des Request ist immer text/plain.

Mit Variante 4 wird der Content Type zwar richtig auf application/json gesetzt, der Name ist aber generiert. Klar, habe ja auch keinen explizit angegeben.

Geändert von Rabenrecht (27. Okt 2022 um 08:32 Uhr)
  Mit Zitat antworten Zitat