Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen (https://www.delphipraxis.net/203951-restrequest-zwei-parameter-mit-identischen-schluessel-hinzufuegen.html)

Blo 9. Apr 2020 11:09

RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen
 
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?

jaenicke 9. Apr 2020 11:40

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen
 
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);

Blo 9. Apr 2020 12:34

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen
 
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?

jaenicke 9. Apr 2020 12:51

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

Zitat von Blo (Beitrag 1461714)
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.

Blo 9. Apr 2020 13:34

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen
 
Hallo Herr Jänicke!

[QUOTE=jaenicke;1461716]
Zitat:

Zitat von Blo (Beitrag 1461714)
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?

Blo 13. Apr 2020 10:12

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

Zitat von Blo (Beitrag 1461720)
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;

TurboMagic 13. Apr 2020 17:47

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen
 
[QUOTE=Blo;1461720]Hallo Herr Jänicke!

Zitat:

Zitat von jaenicke (Beitrag 1461716)
Zitat:

Zitat von Blo (Beitrag 1461714)
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

jaenicke 13. Apr 2020 17:54

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen
 
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.

TurboMagic 13. Apr 2020 19:52

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen
 
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.

jaenicke 13. Apr 2020 23:06

AW: RESTRequest: Zwei Parameter mit identischen Schlüssel hinzufügen
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf