AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Zweites AddHeader im RestRequest geht nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Zweites AddHeader im RestRequest geht nicht

Ein Thema von Incocnito · begonnen am 23. Apr 2020 · letzter Beitrag vom 24. Apr 2020
Antwort Antwort
Seite 1 von 2  1 2      
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#1

Zweites AddHeader im RestRequest geht nicht

  Alt 23. Apr 2020, 16:13
Hi Zusammen,

ich habe eine Rest-Schnittstelle, an welche ich zwei Werte im Header mitschicken muss.
Ich erstelle einen TRestClient, passend dazu einen TRestResponse und einen TRestRequest.
Ich habe nun zwei Parameter, welche ich per Header übergeben muss.
Ich habe nun versucht mit
Delphi-Quellcode:
RESTRequest.Params.AddHeader('Authorization', 'Bearer ' + sAuth);
RESTRequest.Params.AddHeader('X-API-KEY', MAIN_API_KEY);
oder
Delphi-Quellcode:
RESTRequest.AddParameter('Authorization', 'Bearer ' + sAuth, TRESTRequestParameterKind.pkHTTPHEADER);
RESTRequest.AddParameter('X-API-KEY', MAIN_API_KEY, TRESTRequestParameterKind.pkHTTPHEADER);
die Werte hinzuzufügen, aber der Kollege meint, es kommt nur eines von beidem an.
Die gleichen Werte in Postman reinkopiert funktionieren (also kein Tippfehler).
Lustigerweise kommt "X-API_KEY" an, sonst hätte ich das auf das Minus geschoben.
Aber wie gesagt: Ich habe das 1:1 in Postman reinkopiert und dort geht es.

Hat jemand eine Idee, wie ich prüfen kann, was passiert?
Hat jemand mal ein vergleichbares Problem gehabt?
Muss ich irgendwas beachten? Geht das was ich mache unter Delphi einfach nicht? Warum?
Hat irgendjemand eine Idee, wonach ich überhaubt schauen kann?
Ehrlich gesagt weiß ich fast gar nicht wonach ich euch genau fragen soll! -.-

Ich bin für jeden Tipp dankbar.

Mit freundlichem Gruß
Incocnito
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zweites AddHeader im RestRequest geht nicht

  Alt 23. Apr 2020, 17:42
aber der Kollege meint, es kommt nur eines von beidem an.
Sicher das der Kollege recht hat
Chris
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zweites AddHeader im RestRequest geht nicht

  Alt 23. Apr 2020, 17:51
es kommt drauf an, was AddHeader macht
* z.B. falls schon vorhanden das überschreiben

und wie der Empfänger mit dem Header umgeht
* das was kommt blind an seine Header-Objektliste anhängen
* oder dort das was schon war überschreiben
* oder wie es ausgewertet wird, also da wo es ausgelesen wird:
* * mehreres einzeln auswerten
* * oder beim ersten Fund aufhören und nur das Erste verwenden
* * oder beim Auswerden due Liste durchgehen und sich den wert merken, also beim Dupplikat dann mit dem Wert überschreiben und nur das Letzte verwenden


Bei so mancher Komponente gibt es neben dem Header (mit festen/vordefinierten Einträgen) noch einen OptionalHeader, wo man sich nach belieben auslassen kann.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Zweites AddHeader im RestRequest geht nicht

  Alt 24. Apr 2020, 05:24
Hallo,
übergib mal nicht sAuth, sondern z.B. Hallo als festen Wert.

Etwa vor einer Woche war doch schon mal,was mit Bearer gewesen.
Da stimmte das Encoding nicht

Du kannst die AddHeader-Aufrufe auch testweise mal umdrehen.
Heiko

Geändert von hoika (24. Apr 2020 um 06:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Zweites AddHeader im RestRequest geht nicht

  Alt 24. Apr 2020, 06:41
Setze einfach mal einen Haltepunkt auf TCustomRESTRequest.Execute in der Unit REST.Client. Dort wird der Request zusammengebaut.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (24. Apr 2020 um 06:45 Uhr)
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#6

AW: Zweites AddHeader im RestRequest geht nicht

  Alt 24. Apr 2020, 09:52
Hi Zusammen,

Sicher das der Kollege recht hat
Naja, ich glaube ihm, dass sein Programm sagt "da ist nur Wert A aber nicht Wert B".
Mir scheint das aber ein Problem im Zusammenspiel zwischen Delphi und seiner
Programmiersprache zu sein. Hier im Haus hatte ich schonmal ein Problem mit .Net,
wo die Änderung eines Aufrufes von
RESTRequest.Params.AddHeader(...) nach
RESTRequest.AddParameter(...) das Problem behoben hat.
Fragt mich! Ich habe keine Ahnung was das war.
Klingt für mich nach "Oh der Kugelschreiber liegt links von der Tastatur, ja dann kann das Programm auch nicht funktionieren!".

es kommt drauf an, was AddHeader macht
...
Setze einfach mal einen Haltepunkt auf TCustomRESTRequest.Execute in der Unit REST.Client. Dort wird der Request zusammengebaut.
Ich habe nun mal da reingeschaut ... war übersichtlicher als ich befürchtet hatte ...
Dort konnte ich feststellen, dass Params 2 Elemente hat und bis kurz vor dem Senden war auch alles gut.

---

Lösung:
So! Ich habe mir dann gedacht: Gut, baust du mal einen Rest-Server und schaust was da ankommt.
Das war aber auf die Schnelle nicht so einfach zu erreichen.
Ich habe zumindest nichts (jetzt heute morgen mit 15 Minuten suchen) finden können,
dafür bin ich in der Delphi-Hilfe bei meiner Suche aber auf den Rest-Debugger von Embarcadero gestoßen.
Also dachte ich mir: "Ich habe eh das Gefühl, dass ich selbst irgendwas falsch mache und
dass das normalerweise geht, sonst würden sicher schon einige Leute mit Fackel und Forke
vor dem Hauptsitz von Embarcadero rumhocken!" ... Ich habe meine Daten eingegeben und oh Wunder
genau wie in Postman geht es. Nun, im Rest-Debugger war beim Hinzufügen von Parametern ein Haken
"Nicht Verschlüsseln", den ich aktiviert hatte. Als ich den Haken entfernt hatte, bekam ich den
gleichen "401 - Unauthorized"-Fehler im Rest-Debugger, wie ich auch in meinem Programm bekommen habe.
Nach etwas Nachforscherei und habe ich dann herausgefunden, dass "AddParameter" mehrere Parameterlisten hat.
Eine Variation hat "Optionen" und hier kann man "poDoNotEncode" angeben.
Setzt komme ich weiter! Das war das Problem.

Also nochmalzusammengefasst: Bei mir lief es dann, wenn ich beide Parameter mit
RESTRequest.AddParameter('xxx', 'yyy', pkHTTPHEADER, [poDoNotEncode]); übergebe.

Das ganze hat mich dann nochmal Neugierig gemacht und ich habe mal Wireshark angeworfen,
aber egal ob mit oder ohne "poDoNotEncode", bei beidem bekomme ich bei einer https-Verbindung
nur Bytesalat, den ich selbst zumindest nicht mehr entschlüsseln kann.
Scheint also ohne den Header extra zu kodieren auch sicher zu sein.
Frage an dieser Stelle vielleicht nochmal:
Warum können Parameter seperat codiert werden? Was passiert dann?

Und mal so allgemein gefragt: Warum kommt 1 Parameter an, der 2 dann aber nicht?
Habe nur ich solch ein seltsames Verhalten?

Alles so Dinge, wo wir uns nun in Ruhe drüber unterhalten können,
da ich ja nun erstmal weiter komme.

Vielen Dank für die Tipps und Ideen soweit schonmal und ich hoffe,
dass andere in Zukunft durch diesen Post schneller auf die richtige Lösung kommen.
(Obwohl das zugegegebenermaßen doch noch unglaublich fix gelöst war!)

Liebe Grüße
Incocnito
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Zweites AddHeader im RestRequest geht nicht

  Alt 24. Apr 2020, 10:15
poDoNotEncode bedeutet in diesem Fall kein URI-Encoding. Das hat mit Verschlüsselung nichts zu tun, sondern damit, dass bestimmte Zeichen nicht in der URL auftauchen dürfen.

Das wird übrigens auch wirksam bei einem ContentType von APPLICATION_X_WWW_FORM_URLENCODED.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Zweites AddHeader im RestRequest geht nicht

  Alt 24. Apr 2020, 10:57
Wieder so ein Fall, wo ein Blick auf die Logs von Telrik Fiddler den Unterschied zu Postman aufgezeigt und man schneller das Problem eingekreist hätte.
Diese Delphi-REST-Threads häufen sich in letzter Zeit.

Irgendwie ist die Embarcadero-Implementierung unglücklich.
Vielleicht wäre es besser gewesen keine negierende Logik zu verwenden, sondern das nicht-encodieren als Standard zu nehmen und statt eines TRESTRequestParameterOption.poDoNotEncode lieber ein TRESTRequestParameterOption.poDoEncode zu verwenden.
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#9

AW: Zweites AddHeader im RestRequest geht nicht

  Alt 24. Apr 2020, 14:53
poDoNotEncode bedeutet in diesem Fall kein URI-Encoding. Das hat mit Verschlüsselung nichts zu tun, sondern damit, dass bestimmte Zeichen nicht in der URL auftauchen dürfen.

Das wird übrigens auch wirksam bei einem ContentType von APPLICATION_X_WWW_FORM_URLENCODED.
Oh wait! Also ich hatte HTTP nun so verstanden:
1) Ich schicke einen HTTP-Befehl an eine Adresse.
Diese Adresse ist die URL.
2) Dann habe ich eine Art Umverpackung in der in Simple-ASCII mit nur den nötigsten Zeichen
beschrieben wird, was dann kommt. Der Header. Hier könnte dann auch stehen, dass der Body
in UTF-16 codiert ist. Und wann das ganze geschickt wurde. Keine Ahnung, irgendwie sowas.
3) Und am Ende habe ich dann den Body der mit irgendeiner Codierung (was halt im Header steht)
irgendeine lustige Datenmenge enthällt bei dem nur noch gegeben ist, dass die Daten als Bytes
empfangen werden können. Der Body halt. Der muss dann vom Empfänger irgendwie interpretiert werden,
was aber durch die URL (wo bin ich) und den Header (ein paar Basisinformationen) eindeutig machbar ist.

URI-Encoding war für mich das Codieren der Zeichen in der URL (und nur da), damit beispielsweise ein Leerzeichen auch ankommt, falls das Leerzeichen ein Teil der URL-Parameter ist.
Demnach müsste ich aber nur die URL-Parameter codieren (und das müsste eigendlich immer) und nicht die Header-Parameter (da macht das eigendlich nie Sinn, wenn man so denkt wie ich ... nur ASCII).

Gibt es da irgendwo Infos zu wie das genau ist? So auf die Schnelle wird
das wohl kaum einer erklären können und wollen.

---
Wieder so ein Fall, wo ein Blick auf die Logs von Telrik Fiddler den Unterschied zu Postman aufgezeigt und man schneller das Problem eingekreist hätte.
Diese Delphi-REST-Threads häufen sich in letzter Zeit.

Irgendwie ist die Embarcadero-Implementierung unglücklich.
Vielleicht wäre es besser gewesen keine negierende Logik zu verwenden, sondern das nicht-encodieren als Standard zu nehmen und statt eines TRESTRequestParameterOption.poDoNotEncode lieber ein TRESTRequestParameterOption.poDoEncode zu verwenden.
Was für Logs von wem? Wie hätte man da logs aktivieren/einsehen können?
Und wie sollte man das dann mit Postman vergleichen können?
Oder fängt der wie Wireshark den Netzwerkverkehr ab und kann das bei https sogar entschlüsseln?

Ansonsten bin ich mir gerade auch nicht sicher, was der richtige Weg sein sollte.
Meiner (bisherigen!?) Meinung nach sollten die Parameter welche an die URL angehängt werden eh
ohne Außnahme codiert werden (falls das jetzt das "URI-Encode" ist und ich nicht gänzlich was durcheinander haue) und beim Rest halt nie.

Alles in Allem bin ich mehr verwirrt als vorher!

Danke schonmal für die Gedanken und die Hilfen bis hierhin!

Liebe Grüße
Incocnito
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Zweites AddHeader im RestRequest geht nicht

  Alt 24. Apr 2020, 15:18
Bei den Header Feldern muss man unterscheiden zwischen Standard- und Non-Standard. Standard-Header dürfen nur ASCII Zeichen enthalten oder müssen codiert werden (Deswegen ist das Default-Encoding von Embarcadero auch richtig gewählt!). Bei Non-Standard-Headern ist das nicht zwingend erforderlich - da ist das dann von der Implementation abhängig. Im Idealfall ist irgendwo angegeben, ob codiert werden muss oder nicht. Im Zweifel hilft nur ausprobieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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:17 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