Einzelnen Beitrag anzeigen

Benutzerbild von mischerr
mischerr

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

AW: REST Umsetzung eines CURL Befehls nach Delphi

  Alt 28. Nov 2024, 08:56
@Uwe, @gubbe
Vielen Dank für die Hinweise. Der von Uwe geänderte Code funktioniert für eine Datei.

Das Problem ist jedoch, dass AddFile intern AddItem verwendet, welches auf den Namen prüft und eine doppelte Verwendung nicht zulässt.
Mein Ansatz über:
Code:
RESTParam:= FRESTRequest.Params.AddItem;
RESTParam.Name:= 'files';
RESTParam.Value:= ExtractFileName(PdfFile);
RESTParam.SetStream(TFileStream.Create(PdfFile, fmOpenRead), TRESTObjectOwnership.ooREST);
RESTParam.Kind:= TRESTRequestParameterKind.pkFILE;
RESTParam.Options:= [TRESTRequestParameterOption.poDoNotEncode];
RESTParam.ContentType:= GetMIMETypeFromFile(PdfFile);
schlägt jedoch auch fehl, da in innerhalb von RESTRequest.Execute nochmals die Parameterliste neu aufgebaut und doppelten Einträge aussortiert werden - keine Ahnung wieso man das macht und nicht dem Programmierer überlässt.

Mein letzter Versuch war noch über MultipartData.AddFile zu gehen, aber entweder bin ich zu doof, irgendwas stimmt mit folgender Zuweisung nicht.
Code:
FRESTRequest.AddBody(MultipartData.Stream, MultipartData.MimeTypeHeader, TRESTObjectOwnership.ooREST);
Wird auch ablehnt. Wie auch immer...
Ich verwende nun folgenden Code:
Code:
procedure SendFilesIndy2(const PdfFile, XmlFile: string);
var HTTP: TIdHTTP;
    FormData: TIdMultiPartFormDataStream;
    url, Response: string;
begin
  HTTP:= TIdHTTP.Create(nil);
  FormData:= TIdMultiPartFormDataStream.Create;
  try
    HTTP.Request.Accept:= 'application/json';
    HTTP.Request.ContentType:= 'multipart/form-data';
    HTTP.Request.CustomHeaders.AddValue('X-Api-Key', MY_API_KEY);
    AttachSSLHandler(HTTP, [sslvTLSv1_2]);
    if PdfFile<>'' then
      FormData.AddFile('files', PdfFile, GetMIMETypeFromFile(PdfFile));
    if XmlFile<>'' then
      FormData.AddFile('files', XmlFile, GetMIMETypeFromFile(XmlFile));
    url:= 'MyURL';
    Response:= HTTP.Post(url, FormData);
    // ...
  except
//    on E: EIdHTTPProtocolException do
  end;
  FormData.Free;
  HTTP.Free;
end;
Zumindest zeigt Postman eine plausible Content-Length an und wie API akzeptiert auch den Request.
Muss nur noch mit dem Anbieter klären, ob die Dateien auch korrekt empfangen wurden - im Moment gehe ich aber davon aus.

Jetzt stehe ich aber von einem Gewissensproblem:
Bleibe ich bei den übrigen API-Aufrufen beider Kombi aus RESTClient/Request/Response oder stelle ich komplett auf Indy um?
  Mit Zitat antworten Zitat