@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?