AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke REST Umsetzung eines CURL Befehls nach Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

REST Umsetzung eines CURL Befehls nach Delphi

Ein Thema von mischerr · begonnen am 27. Nov 2024 · letzter Beitrag vom 28. Nov 2024
Antwort Antwort
Benutzerbild von mischerr
mischerr

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

AW: REST Umsetzung eines CURL Befehls nach Delphi

  Alt 27. Nov 2024, 11:48
@Rollo62
Ja, ich kenne den REST-Debugger. Aber leider finde ich keine Infos dazu, wie ich die Dateien dort anhängen kann.

@gubbe
Ja, hast Recht - hatte ich übersehen beim Erstellen des Codes hier in Forum.
Normalerweise sind das Elemente der Klasse.

@Bbommel
Danke für den Code. Leider bekomme ich aber noch immer ein http/400.
Da "AddItem" nicht mehrere gleichlautenden Parameter zulässt, habe ich das zum Test "MultipartData" entfernt und wie folgt geändert
Code:
if PdfFile<>'' then begin
  RESTParam:= RESTRequest.Params.AddItem;
  RESTParam.Name:= 'files';
  RESTParam.SetStream(TFileStream.Create(PdfFile, fmOpenRead), ooREST);
  RESTParam.Kind:= pkFILE;
  RESTParam.Options:= [poDoNotEncode];
  RESTParam.ContentType:= GetMIMETypeFromFile(PdfFile);
end;
Selbes für die 2te Datei.

Der Anbieter der API schreibt das die Dateien als "files" und als "array" zu übertragen sind - ist das damit gegeben?
Ober übersehe ich eine Methode um mehrere Dateien mit identischem "Schlüssel" zu übertragen?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#2

AW: REST Umsetzung eines CURL Befehls nach Delphi

  Alt 27. Nov 2024, 13:16
Der Anbieter der API schreibt das die Dateien als "files" und als "array" zu übertragen sind
Am besten fragst du mal nach einem Beispiel.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
150 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: REST Umsetzung eines CURL Befehls nach Delphi

  Alt 27. Nov 2024, 13:27
Ich habe meinen Code mal durchsucht nach einem RestRequest mit Dateiübertragung.
Dabei habe ich auch einfach "Request.addfile" verwendet, aber das war nur eine Datei.
Das Problem ist vielleicht wirklich der Dateiname "files". Hast Du es schon einmal mit Varianten probiert wie files[0] und files[1]?

Ansonsten, wenn es mit Curl funktioniert, würde ich mir mal die HTTP-Kommunikation in einem "Debugging Proxy" anschauen. z.B. mit mitmproxy, fiddler oder Charles.
Dann kannst Du vergleichen und gezielt die Unterschiede ausbügeln.
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
150 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: REST Umsetzung eines CURL Befehls nach Delphi

  Alt 27. Nov 2024, 13:37
Wenn Du bei Curl noch "--trace -" bzw. "--trace-ascii -" dranhängst, siehst Du auch, wie es versendet wird. Vielleicht gibt das schon einen Hinweis darauf, wie es aussehen sollte.

Probiere auch mal "files[]" als Dateiname.

Geändert von gubbe (27. Nov 2024 um 13:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

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

AW: REST Umsetzung eines CURL Befehls nach Delphi

  Alt 27. Nov 2024, 14:01
Also wenn ich unter Postman den Request simuliere (funktioniert) und anschließend eine "Mock collection" starte sehe ich, dass mein von Delphi an die Mock Adresse gesendeter Request für den Content-Typ keine "boundary" enthält.

Postman_ReqBody.jpg

Postman_Workspace.jpg

Hätte nicht gedacht dass sdas so kompliziert wird.
Werde wohl versuchen vom Anbieter ein Beispiel zu bekommen.

BTW: Es müssen keine 2 Dateien versendet werden - eine reicht auch. Dennoch immer nur 404...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#6

AW: REST Umsetzung eines CURL Befehls nach Delphi

  Alt 27. Nov 2024, 14:20
Ich empfehle auch die Bordmittel (RESTRequest.AddFile) zu verwenden. Dabei werden sowohl der ContentType als auch die Boundary entsprechend gesetzt. Eine dementsprechend korrigierte Version deines Codes könnte dann so aussehen:
Delphi-Quellcode:
procedure SendFilesREST(const PdfFile, XmlFile: string);
var RESTClient: TRESTClient;
    RESTRequest: TRESTRequest;
    RESTResponse: TRESTResponse;
begin
  RESTRequest:= TRESTRequest.Create(nil);
  try
    RESTClient:= TRESTClient.Create(RESTRequest);
    RESTResponse:= TRESTResponse.Create(RESTRequest);
    RESTRequest.Client:= RESTClient;
    RESTRequest.Response:= RESTResponse;
    RESTRequest.Method:= rmPost;
    RESTRequest.ConnectTimeout:= -1;
    RESTRequest.ReadTimeout:= -1;
    RESTRequest.Accept := TRESTContentType.ctAPPLICATION_JSON;
    RESTRequest.AddAuthParameter('X-Api-Key', 'My-API-Key', TRESTRequestParameterKind.pkHTTPHEADER);
    RESTClient.BaseURL:= 'https://<provider>/Documents/Outbox';
    RESTRequest.Method:= rmPOST;
    if PdfFile<>'then
      RESTRequest.AddFile('files', PdfFile, TRESTContentType.ctAPPLICATION_PDF);
    if XmlFile<>'then
      RESTRequest.AddFile('files', XmlFile, TRESTContentType.ctTEXT_XML);
    RESTRequest.Execute;
    if RESTResponse.Status.Success then begin
      // ...
    end;
  finally
    RESTRequest.Free;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
150 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: REST Umsetzung eines CURL Befehls nach Delphi

  Alt 27. Nov 2024, 14:27
Ich fürchte trotzdem, dass zwei Parameter mit gleichem Namen (files) so nicht funktionieren werden, weil dann die zweite Datei die erste überschreibt. Wenn man sich TRESTRequestParameterList.AddItem anschaut, wird erst nach einem Parameter mit gleichen Namen gesucht und dann ggf. ersetzt.
Aber das scheint ja noch gar nicht das Problem zu sein, wenn man auch nur eine Datei übertragen könnte.

Dass Delphi im Content-Type das Boundary nicht vorher definiert, sehe ich auch. Gibt denn der Server ausser dem HTTP-Code 400 noch etwas anderes zurück, das bestätigen könnte, dass es an der Boundary-Definiton liegt?
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz