Einzelnen Beitrag anzeigen

Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#1

REST Umsetzung eines CURL Befehls nach Delphi

  Alt 27. Nov 2024, 09:25
Hallo.

Ich habe eine Problem dass mich schon seit 2 Tagen verfolgt.
Und zwar muss ich folgenden CURL-Befehl zur Nutzung einer API in Delphi umsetzen welcher mehrere Dateien über ein "files" array überträgt:
Code:
curl -X 'POST' \
  'https://<provider>/Documents/Outbox'
  -H 'accept: application/json'
  -H 'X-Api-Key: My-API-Key'
  -H 'Content-Type: multipart/form-data'
  -F 'files=@testFile.pdf;type=application.pdf'
  -F 'files=@testFile.xml;type=text/xml'
Der CURL-Befehl funktioniert. Die Dateien liegen vor.
Ich habe es per RESTClient wie auch Indy versucht.
Andere Befehle welche per GET JSON Daten austauschen funktionieren einwandfrei.
Jedoch beim POST erhalte ich immer nur ein http/400.

Indy:
Code:
procedure SendFilesIndy(const PdfFile, XmlFile: string);
var HTTP: TIdHTTP;
    FormData: TIdMultiPartFormDataStream;
    Response: string;
begin
  HTTP:= TIdHTTP.Create(nil);
  FormData:= TIdMultiPartFormDataStream.Create;
  try
    HTTP.Request.CustomHeaders.AddValue('Accept', 'application/json');
    HTTP.Request.CustomHeaders.AddValue('X-Api-Key', 'My-API-Key');
    HTTP.Request.CustomHeaders.AddValue('Content-Type', 'multipart/form-data');
    AttachSSLHandler(HTTP, [sslvTLSv1_2]); // Setzt IOHandler
    if PdfFile<>'' then
      FormData.AddFile('files', PdfFile, GetMIMETypeFromFile(PdfFile));
//    FormData.AddFormField('files', ExtractFileName(PdfFile), '', GetMIMETypeFromFile(PdfFile), PdfFile);
    if XmlFile<>'' then
      FormData.AddFile('files', XmlFile, GetMIMETypeFromFile(XmlFile));
//    FormData.AddFormField('files', ExtractFileName(XmlFile), '', GetMIMETypeFromFile(XmlFile), XmlFile);
    Response:= HTTP.Post('https://<provider>/Documents/Outbox', FormData);
    // ...
  except
    on E: EIdHTTPProtocolException do begin
      OutputDebugStr(pchar('HTTP-Fehler: '+E.ErrorMessage+#13#10+'Antwort des Servers: '+E.Message));
    end;
    on E: Exception do
      OutputDebugStr(pchar('Allgemeiner Fehler: '+E.Message));
  end;
  FormData.Free;
  HTTP.Free;
end;
RESTClient:
Code:
procedure SendFilesREST(const PdfFile, XmlFile: string);
var RESTClient:= TRESTClient;
    RESTRequest:= TRESTRequest;
    RESTResponse:= TRESTResponse;
    MultipartData: TMultipartFormData;
begin
  RESTClient:= TRESTClient.Create(nil);
  RESTRequest:= TRESTRequest.Create(nil);
  RESTResponse:= TRESTResponse.Create(nil);
  RESTRequest.Client:= RESTClient;
  RESTRequest.Response:= RESTResponse;
  RESTRequest.Method:= rmPost;
  RESTRequest.ConnectTimeout:= -1;
  RESTRequest.ReadTimeout:= -1
  RESTRequest.Params.AddHeader('Accept', 'application/json');
  RESTRequest.Params.AddHeader('X-Api-Key', 'My-API-Key');
  RESTRequest.Params.AddHeader('Content-Type', 'multipart/form-data');
  MultipartData:= TMultipartFormData.Create;
  try
    FRESTClient.BaseURL:= 'https://<provider>/Documents/Outbox';
    FRESTRequest.Method:= rmPOST;
    if PdfFile<>'' then
      MultipartData.AddFile('files', PdfFile, GetMIMETypeFromFile(PdfFile));
    if XmlFile<>'' then
      MultipartData.AddFile('files', XmlFile, GetMIMETypeFromFile(XmlFile));
    FRESTRequest.AddBody(MultipartData);
    FRESTRequest.Execute;
    if FRESTResponse.Status.Success then begin
      // ...
    end;
  finally
    RESTClient.Free;
    RESTRequest.Free;
    RESTResponse.Free;
    MultipartData.Free;
  end;
end;
Hat evtl. jemand sowas schon mal erfolgreich versucht und einen Tip für mich?
  Mit Zitat antworten Zitat