Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to post data with a ContentType of 'multipart/form-data' in Delphi REST?

I am trying to send a request to a REST API using multipart/form-data as the content type.

I always get "HTTP/1.1 500 Internal Error" as a response.

I tried sending requests to methods that require application/x-www-form-urlencoded and had success, though.

How can I achieve getting a success response from my API using multipart/form-data?

Here is my code:

procedure TForm10.Button1Click(Sender: TObject);
var
  RESTClient1: TRESTClient;
  RESTRequest1: TRESTRequest;
  strImageJSON : string;
  Input: TIdMultipartFormDataStream;
begin
  Input := TIdMultipartFormDataStream.Create;
  Input.Clear;
  Input.AddFormField('Email', '[email protected]');
  Input.AddFormField('Password', 'xxxx');
  RESTClient1 := TRESTClient.Create('http://192.168.1.172:81/');
  RESTRequest1 := TRESTRequest.Create(nil);
  RESTRequest1.Method := TRESTRequestMethod.rmPOST;
  RESTRequest1.Resource := 'api/Mobile/MobileLoginControl';
  RESTRequest1.AddBody(Input,TRESTContentType.ctMULTIPART_FORM_DATA);
  RESTRequest1.Client := RESTClient1;
  RESTRequest1.Execute;
  strImageJSON := RESTRequest1.Response.Content;
end;
like image 712
Ruhi Goktas Avatar asked Jan 31 '26 03:01

Ruhi Goktas


1 Answers

Embarcadero's REST component has its own built in multipart/form-data capabilities via the TRESTRequest.AddParameter() method:

procedure TForm10.Button1Click(Sender: TObject);
var
  RESTClient1: TRESTClient;
  RESTRequest1: TRESTRequest;
  strImageJSON : string;
begin
  RESTClient1 := TRESTClient.Create('http://192.168.1.172:81/');
  try
    RESTRequest1 := TRESTRequest.Create(nil);
    try
      RESTRequest1.Method := TRESTRequestMethod.rmPOST;
      RESTRequest1.Resource := 'api/Mobile/MobileLoginControl';
      RESTRequest1.AddParameter('Email', '[email protected]', TRESTRequestParameterKind.pkREQUESTBODY);
      RESTRequest1.AddParameter('Password', 'xxxx', TRESTRequestParameterKind.pkREQUESTBODY);
      RESTRequest1.Client := RESTClient1;
      RESTRequest1.Execute;
      strImageJSON := RESTRequest1.Response.Content;
    finally
      RESTRequest1.Free;
    end;
  finally
    RESTClient1.Free;
  end;
end;

You don't need to use use Indy's TIdMultiPartFormDataStream, especially when you are not using Indy's TIdHTTP.

like image 117
Remy Lebeau Avatar answered Feb 02 '26 22:02

Remy Lebeau



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!