AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen
Thema durchsuchen
Ansicht
Themen-Optionen

RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen

Ein Thema von Blo · begonnen am 9. Apr 2020 · letzter Beitrag vom 14. Apr 2020
Antwort Antwort
Benutzerbild von Blo
Blo

Registriert seit: 20. Feb 2005
Ort: Kaarst
91 Beiträge
 
Delphi 12 Athens
 
#1

RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen

  Alt 9. Apr 2020, 11:09
Ich möchte einem RESTRequest zwei Parameter zuweisen, bei dem die Schlüsselbezeichnungen identisch sind:

1. Beispiel:
Code:
RESTRequest.Params.AddItem('file','Test.pdf',TRESTRequestParameterKind.pkFILE);
RESTRequest.Params.AddItem('file','Test.json',TRESTRequestParameterKind.pkFILE);
Bei RESTRequest.Execute wird nur die 2. Datei übertragen. Hat also nicht geklappt!

2. Beispiel:
Code:
RESTRequest.Params.AddItem('file_1','Test.pdf',TRESTRequestParameterKind.pkFILE);
RESTRequest.Params.AddItem('file_2','Test.json',TRESTRequestParameterKind.pkFILE);
Bei RESTRequest.Execute werden zwar beide Dateien übertragen, die Schlüssel sind aber verschieden!

Intern scheint Delphi(procedure MergeParam)darauf zu achten, dass die Schlüssel nicht doppelt vorkommen.

Dennoch die Frage: Gibt es in Delphi eine Möglichkeit, zwei Parameter in einem RESTRequest mit denselben Schlüssel aufzunehmen?
Ulrich Blomeyer
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.961 Beiträge
 
Delphi 12 Athens
 
#2

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen

  Alt 9. Apr 2020, 11:40
Das ist sogar recht simpel, wenn auch nicht mit den vorhandenen Methoden:
Delphi-Quellcode:
type
  TMultiParamRESTRequestParameterListHelper = class helper for TRESTRequestParameterList
    function AddMultiItem(const AName, AValue: string; AKind: TRESTRequestParameterKind;
      AOptions: TRESTRequestParameterOptions = []): TRESTRequestParameter;
  end;

...

{ TMultiParamRESTRequestParameterListHelper }

function TMultiParamRESTRequestParameterListHelper.AddMultiItem(const AName, AValue: string;
  AKind: TRESTRequestParameterKind; AOptions: TRESTRequestParameterOptions): TRESTRequestParameter;
begin
  Self.BeginUpdate;
  try
    Result := Self.Add as TRESTRequestParameter;
    Result.Name := AName;
    Result.Value := AValue;
    Result.Kind := AKind;
    Result.Options := AOptions;
  finally
    Self.EndUpdate;
  end;
end;
Der class helper kann auch in einer eigenen Unit liegen, die bei Verwendung eingebunden wird. Und dann einfach so aufrufen:
Delphi-Quellcode:
  RESTRequest.Params.AddMultiItem('file', 'Test.pdf', TRESTRequestParameterKind.pkFILE);
  RESTRequest.Params.AddMultiItem('file', 'Test.json', TRESTRequestParameterKind.pkFILE);
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Blo
Blo

Registriert seit: 20. Feb 2005
Ort: Kaarst
91 Beiträge
 
Delphi 12 Athens
 
#3

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen

  Alt 9. Apr 2020, 12:34
Hallo Herr Jänicke!

Danke für den Tipp.

Habe ich eingebunden.

Allerdings wenn ich RESTRequest.Execute aufrufe, wird nur eine Datei im Request hochgeladen (wieder nur die 2. Datei).

Ist das nicht zu erwarten, weil RESTRequest.Execute intern CreateUnionParameterList und MergeParam aufruft und hier wird auf identische Schlüssel hin überprüft.

Oder habe ich da etwas nicht verstanden?
Ulrich Blomeyer
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.961 Beiträge
 
Delphi 12 Athens
 
#4

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen

  Alt 9. Apr 2020, 12:51
Allerdings wenn ich RESTRequest.Execute aufrufe, wird nur eine Datei im Request hochgeladen (wieder nur die 2. Datei).

Ist das nicht zu erwarten, weil RESTRequest.Execute intern CreateUnionParameterList und MergeParam aufruft und hier wird auf identische Schlüssel hin überprüft.
So weit habe ich nicht geschaut. Ich dachte es würde vielleicht nur einmal geprüft.
Mehrere gleichnamige Parameter sind leider auch nicht im Standard definiert, von daher ist die Implementierung auch nicht prinzipiell falsch. Es steht im Standard aber auch nicht, dass die Parameter unterschiedliche Namen haben müssen.

Dann bleibt leider nur die ganze Unit zu kopieren und zu modifizieren. Denn ansonsten ginge es nur mit dreckigen Tricks, die man nicht verwenden sollte.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Blo
Blo

Registriert seit: 20. Feb 2005
Ort: Kaarst
91 Beiträge
 
Delphi 12 Athens
 
#5

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen

  Alt 9. Apr 2020, 13:34
Hallo Herr Jänicke!

[QUOTE=jaenicke;1461716]
Dann bleibt leider nur die ganze Unit zu kopieren und zu modifizieren.
Ja dann klappt es! Und der Server schickt keine Fehlernachricht! (Nach so vielen fehlerhaften Versuchen, erwartet man ja schon vom Server Fehlernachrichten)

Noch eine Anschlussfrage: Der Server schickt in seiner Antwort eine pdf-Datei mit. Die ergibt sich aus den oben erwähnten beiden Dateien.
In "Postman" klicke ich einfach auf "Save Response".

Ich habe nach einem Beispiel gesucht, wie ich das in Delphi mache. In der Hilfe (Handling an HTTP Response) steht nur Grundsätzliches. Haben Sie / Hat jemand hier für ein Beispiel?
Ulrich Blomeyer
  Mit Zitat antworten Zitat
Benutzerbild von Blo
Blo

Registriert seit: 20. Feb 2005
Ort: Kaarst
91 Beiträge
 
Delphi 12 Athens
 
#6

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen

  Alt 13. Apr 2020, 10:12
Noch eine Anschlussfrage: Der Server schickt in seiner Antwort eine pdf-Datei mit. Die ergibt sich aus den oben erwähnten beiden Dateien.
In "Postman" klicke ich einfach auf "Save Response".

Ich habe nach einem Beispiel gesucht, wie ich das in Delphi mache. In der Hilfe (Handling an HTTP Response) steht nur Grundsätzliches. Haben Sie / Hat jemand hier für ein Beispiel?
... hat sich mittlerweile erledigt. Lösung ist eigentlich ganz einfach:

Code:
procedure TfRestTest.RESTRequestAfterExecute(Sender: TCustomRESTRequest);
var
  msPdfContent: TMemorystream;
begin
  msPdfContent:= TMemorystream.Create;
  try
    msPdfContent.WriteData(RESTResponse.RawBytes, length(RESTResponse.RawBytes));
    msPdfContent.SaveToFile('Test_sig.pdf');
  finally
    msPdfContent.Free;
  end;
end;
Ulrich Blomeyer
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.048 Beiträge
 
Delphi 12 Athens
 
#7

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen

  Alt 13. Apr 2020, 17:47
[QUOTE=Blo;1461720]Hallo Herr Jänicke!

Dann bleibt leider nur die ganze Unit zu kopieren und zu modifizieren.
Ja dann klappt es! Und der Server schickt keine Fehlernachricht! (Nach so vielen fehlerhaften Versuchen, erwartet man ja schon vom Server Fehlernachrichten)
Verstehe ich das richtig: mittels Kopieren/Modifizieren einer RTL unit kann man diese Beschränkung auf "jeder Parametername darf nur einmal vorkommen"
beseitigen?

Falls dem so ist wäre denke ich ein QP request angebracht, dass die HTTP Komponenten mehrere gleichnamige Parameter erlauben sollten,
da manche REST APIs das so verlangen (im Report dann das benutzte API als Beispiel aufführen).

Sonst kopieren wir anderen auch übermorgen noch Units und passen die manuell an...
Die sind dann bei jedem Update auf andere Änderungen des Originals abzuprüfen um diese dann übernehmen zu können

Grüße
TurboMagic
  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 09:17 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