Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   JSON & Indy 2. Aufruf bringt 502 Bad Gateway (https://www.delphipraxis.net/194154-json-indy-2-aufruf-bringt-502-bad-gateway.html)

Supergr 23. Okt 2017 10:34

JSON & Indy 2. Aufruf bringt 502 Bad Gateway
 
Hallo Zusammen,

langsam verzweifel ich an dem Problem. Ich muss an einen HTTPS Server ein JSON formatierte Daten versenden und bekomme
von dem Server dann eine ID zurück. Beim ersten Post gehts wunderbar, alles toll. Jedoch beim 2. Post bekomme ich
immer einen 502 Bad Request zurück. Jemand eine Idee woran das liegen könnte?

In jo befindet sich das JSON Object.
Ich würde auch ein anderes Object als INDY nehmen. Kostenpflichtig wäre kein Problem. Ich finde leider nichts sinnvolles...

Delphi XE7
Indy 10.6.1

Hier der Code der Subroutine:

Code:
procedure TForm1.CmdUpdateClick(Sender: TObject);
var
  SendString   : TStringStream;
  RcvString    : TStringStream;
  IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
  IdHTTP1: TIdHTTP;
begin
  IdHTTP1 := TIdHTTP.Create();
  IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create();
  IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
  IdHTTP1.Request.Accept := 'application/json';
  IdHTTP1.Request.AcceptEncoding := 'utf-8';
  IdHTTP1.Request.ContentEncoding := 'utf-8';
  IdHTTP1.Request.ContentType := 'application/json';
  IdHTTP1.HttpOptions := [hoNoProtocolErrorException];
  RcvString := TStringStream.Create;
  try
    SendString := TStringStream.Create(UTF8Encode(jo.ToString));
    try
      IdHTTP1.Post('https://www.egym.de/egym-rest/gymapi/user/publish?' + apiAccessKey, SendString, RcvString);
    except
      // Tue nichts, springe nur raus...
    end;
  finally
    SendString.Free;
  end;
  Memo1.Lines.Clear;
  Memo1.Lines.Add(Format('Response Code: %d', [IdHTTP1.ResponseCode]));
  Memo1.Lines.Add(Format('Response Text: %s', [IdHTTP1.ResponseText]));
  Memo1.Text := AdsData.FieldByName('eMail').AsString + ' erl. ID: "' + RcvString.DataString + '"';
  IdStr := RcvString.DataString;
  RcvString.Free;
  IdSSLIOHandlerSocketOpenSSL1.Close;
  idHTTP1.Disconnect;
  IdSSLIOHandlerSocketOpenSSL1.Free;
  IdHTTP1.Free;
für jede Idee oder Hilfe wäre ich sehr dankbar!

Stefan

mjustin 23. Okt 2017 12:17

AW: JSON & Indy 2. Aufruf bringt 502 Bad Gateway
 
Es wird also nur zwei mal der POST Befehl mit identischen Daten gesendet, d.h. zwei mal CmdUpdateClick ausgeführt?

Edit: sorry, habe die globale Variable "jo" entdeckt. Diese ist in beiden POSTs vermutlich nicht gleich?

Anstatt den Umweg über Utf8Encode zu gehen kann man direkt das Encoding des TStringStreams angeben:
Delphi-Quellcode:
RequestBody := TStringStream.Create(jo, TEncoding.UTF8);
Der SSL SocketHandler kann auch mit der HTTP Komponente als Owner erzeugt werden, dadurch spart man das Close und Free ein:

Delphi-Quellcode:
IdHTTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
Edit:
Bei neueren Indy Versionen muss man den SSL Handler nicht mehr erzeugen, IdHTTP macht das dann für HTTPS Urls automatisch.

Der schöne Günther 23. Okt 2017 12:32

AW: JSON & Indy 2. Aufruf bringt 502 Bad Gateway
 
Was denn nun? HTTP 400 ist "Bad Request", HTTP 502 ist "Bad Gateway"...

Außerdem: Ich weiß ja nicht WAS du verschickst, aber wenn du z.B. zwei mal das gleiche schickst ist es vom Protokoll her vielleicht auch völlig legitim das zu verweigern?

Supergr 23. Okt 2017 13:30

AW: JSON & Indy 2. Aufruf bringt 502 Bad Gateway
 
@ mjustin Danke

@ Der schöne Günther
Sorry! Mein Fehler! 502 Bad Gateway!

In beiden Fällen ist der Inhalt von jo unterschiedlich!
Es handelt sich jedesmal um ein paar Strings und ein Foto (Binary).
Das sind Personendaten (ID; Adresse usw.) die an die Online App übertragen werden.

Aktuell behelfe ich mir so das ich beim 2 Aufruf mein Programm einfach
neustarte. Dabei funktionierts dann wieder genau einmal.

TiGü 23. Okt 2017 13:48

AW: JSON & Indy 2. Aufruf bringt 502 Bad Gateway
 
Zitat:

Zitat von Supergr (Beitrag 1383953)
In beiden Fällen ist der Inhalt von jo unterschiedlich!

Lass dir doch beide Strings mal ausgeben und prüfe doch erstmal, ob das valide ist.

Supergr 23. Okt 2017 15:16

AW: JSON & Indy 2. Aufruf bringt 502 Bad Gateway
 
Habe jetzt etwas anders gemacht.

Ich lösche das TJSONObject (jo) nicht mehr, sondern löse es mit RemovePair wieder auf, dass es am Ende leer ist = "{}"
und fülle es einfach wieder neu.
Es scheint wohl in der Implementierung der System.JSON von Delphi ein Fehler bei der Auflösung zu sein. Der 502 Bad Gateway Fehler erscheint
jetzt nicht mehr. Dafür "sammelt" das Programm jetzt Speicher. :twisted: Ist zwar unschön aber die Workstation wird eh
jede Nacht neugestartet. Werde das jetzt mal beobachten wieviel Speicher sich ansammelt.

Beim Ansehen des JSON OBjects war übrigens nichts zu sehen! Alles sah vollkommen normal aus!

Danke Euch jedenfalls für die Ideen! :thumb:

Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 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