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
Seite 1 von 2  1 2      
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, 12: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

Registriert seit: 10. Jun 2003
Ort: Berlin
9.581 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 9. Apr 2020, 12: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
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  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, 13: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

Registriert seit: 10. Jun 2003
Ort: Berlin
9.581 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 9. Apr 2020, 13: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
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  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, 14: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, 11: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
2.939 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 13. Apr 2020, 18: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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.581 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 13. Apr 2020, 18:54
Es wäre hier am sinnvollsten ein Supportticket aufzumachen und zu schreiben mit welchen Änderungen das lösbar ist. Dann ist die Chance am größten, dass da zeitnah etwas passiert. Denn letztlich ist das ja keine große Änderung und die implementierte Einschränkung auf einen gleichnamigen Parameter so nirgends in einem Standard festgelegt.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
TurboMagic

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

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

  Alt 13. Apr 2020, 20:52
Jein: ja, ein Supportticket ist ein direkterer Zugang zu EMBT, aber ob das dadurch schneller übernommen wird ist fraglich. Mit einem QP Report können wir jedenfalls den Status verfolgen und mittels Abstimmen anzeigen, dass wir das auch wollen.

Die geänderte Quellcode Datei kann man auch da anhängen. Andere können die dann dort auch direkt sehen, was beim Support Ticket nicht gegeben ist.

Beides hat seine Vor- und Nachteile und auch ich möcjte diese Änderung schnellstmöglich mit aufgenommen haben.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.581 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 14. Apr 2020, 00:06
Ja, es ist sinnvoll beides zu machen. Ich habe das auch schon so gemacht, dass ich einen QP-Eintrag erstellt habe und dann im Supportticket darauf verwiesen habe.

Ich habe nun doch noch einen entsprechenden Eintrag in den Standard-Beschreibungen gefunden:
https://tools.ietf.org/html/rfc7578#page-5
Zitat:
To match widely deployed implementations, multiple files MUST be sent
by supplying each file in a separate part but all with the same
"name" parameter.
Es ist also in der Form auch in der Spezifikation des Medientyps multipart/form-data enthalten! Damit ist die Implementierung von Embarcadero schlicht nicht dem Standard entsprechend.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (14. Apr 2020 um 00:09 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 00:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz