Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Data (https://www.delphipraxis.net/212067-ich-habe-einen-tcpserver-als-http-server-und-moechte-daten-aus-einem-post-json-data.html)

joehd 12. Dez 2022 11:21

Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Data
 
Hallo vorab ich bin neu in dem HTTP Post Kram ...
Wie empfange ich Json Data aus einem Post per TWebHTTPRequest Post

Ich habe den HTTP Server soweit geschrieben das er "normal" funktioniert. HTTp Get
Habe POST und Options rausgefiltert.

Aber wie komme ich jetzt an den Daten Stream ? Es werden Textdaten übergeben.
Der Server besteht wie zu sehen hauptsächlich aus start Stop und der Beantwortung dedr Anfragen.
Wenn ich es richtig verstehe sollte wenn der Aufbau der Verbindung fertig ist was ja wohl klappt eine Abfrage der Daten möglich sein, zumindest nachdem man sie akzeptiert hat.

Wie Bringe ich den Client dazu mir die Daten im Textformat zu senden ?
Muss ich ein Accept als Sendline zurück senden ? Wie erhalte ich die Infos über die Puffergröße ?

Herzlichen Dank an Euch ...
Grüße
Joachim

"
RequestLine:OPTIONS /Kontakt/index.html HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0
Accept: */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Access-Control-Request-Method: POST
Access-Control-Request-Headers: cache-control
Referer: http://localhost:8000/
Origin: http://localhost:8000
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
"


Delphi-Quellcode:
unit WebserverUnit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sockets, ComCtrls;

type
  TForm1 = class(TForm)
    TcpServer1: TTcpServer;
    Memo1: TMemo;
    Start: TButton;
    Stop: TButton;
    StatusBar1: TStatusBar;
    Button1: TButton;
    Memo2: TMemo;
    IsOnline: TCheckBox;
    procedure StartClick(Sender: TObject);
    procedure StopClick(Sender: TObject);
    procedure TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure TcpServer1Listening(Sender: TObject);
    procedure TcpServer1GetThread(Sender: TObject;
      var ClientSocketThread: TClientSocketThread);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  mypfad : String;
 
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Stop.Click;
 form1.TcpServer1.Free;
 Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
var pfad : String;
begin
  pfad := GetCurrentDir + '/webDocs';
  if not DirectoryExists(Pfad) then ForceDirectories(Pfad);
  pfad := GetCurrentDir + '/Err';
  if not DirectoryExists(Pfad) then ForceDirectories(Pfad);
end;

procedure TForm1.StartClick(Sender: TObject);
begin
 Form1.TcpServer1.Open;
 Form1.TcpServer1.Active := true;
 memo1.lines.add(Datetimetostr(now) + ' : Server Start ');
 isonline.Checked :=   Form1.TcpServer1.Active;
 if isonline.checked = false then
    Showmessage('Fehler beim Starten');
end;

procedure TForm1.StopClick(Sender: TObject);
begin
 Form1.TcpServer1.Close;
 Form1.TcpServer1.Active := false;
 memo1.lines.add(Datetimetostr(now) + ' : Server Stop ');
  isonline.Checked :=   Form1.TcpServer1.Active;
 if isonline.checked = true then
    Showmessage('Fehler beim Stoppen');
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
  rawData,Path,Agent,RawAgent:String;
  HttpPos,AgentPos:Integer;
  TmpStr,TmpStr1:String;
  RequestFile, RequestHeader:TStringList;
  I: Integer;
  DataText : TStream;
  lParamList: TStringStream;
begin
 RawData:=' ';
 RequestFile := TStringList.Create;
 RequestHeader := TStringList.create;

  while ClientSocket.Connected do
    begin

    RawData := ClientSocket.Receiveln;
    memo1.Lines.add('RawLine:' + rawdata + '#Endline'); // Logfile
    while RawData <> '' do
      begin
        RequestHeader.add(RawData);
        RawData := ClientSocket.Receiveln;
        memo2.Text := ('RequestLine:' + RequestHeader.Text );
      end;

     Sleep(100);

     for I := 0 to RequestHeader.Count -1 do
      begin

        if RequestHeader.Strings[i] = '' then
          begin
            Sleep(100);
            Continue;
          end;

        if Pos('User-Agent:', RequestHeader.Strings[i]) > 0 then
          begin
            RawAgent := RequestHeader.Strings[i];
            AgentPos := Pos('User-Agent:',RawAgent);
            Agent := Copy(RawAgent,13,Length(RawAgent)-12);
            Form1.Memo1.Lines.Add('User-Agent : ' + Agent);
          end;

        if Copy(RequestHeader.Strings[i],1,3) = 'GET' then
          begin
            Form1.Memo1.lines.add(' GET Request');
            HttpPos := Pos('HTTP',RequestHeader.Strings[i]);
            Path := Copy(RequestHeader.Strings[i],5,HttpPos -6);
            Form1.Memo1.lines.add('Request For Page : ' + Path);


          end;

        if Copy(RequestHeader.Strings[i],1,4) = 'POST' then
          begin
            Form1.Memo1.lines.add(' POST Request');
            HttpPos := Pos('HTTP',RequestHeader.Strings[i]);
            Path := Copy(RequestHeader.Strings[i],6,HttpPos -6);
            Form1.Memo1.lines.add('Request For Page : ' + Path);
            if RequestHeader.Text = 'OPTIONS /Kontakt/index.html HTTP/1.1' then
              Begin             // KOntaktdaten kommen
                Clientsocket.WaitForData(10);
                TmpStr1 := Clientsocket.Receiveln('#$D#$A');
                if length(TmpStr1) > 0  then
                   Memo1.Lines.add('Receive: ' + TmpStr1 ) ;
              End;
          // Accept Post

          end;


        if Copy(RequestHeader.Strings[i],1,7) = 'OPTIONS' then
          begin
            Form1.Memo1.lines.add(' Option Request');
            HttpPos := Pos('HTTP',RequestHeader.Strings[i]);
            Path := Copy(RequestHeader.Strings[i],9,HttpPos -6);
            Form1.Memo1.lines.add('Option Page : << ' + Path + ' >>');
            if Copy(RequestHeader.Strings[i],1,7) = 'OPTIONS' then
              Begin             // KOntaktdaten kommen
                // Clientsocket.ReceiveFrom(mybuffer,length(mybuffer),);
                Clientsocket.WaitForData(10);
                TmpStr1 := Clientsocket.Receiveln('#$D#$A');
                if length(TmpStr1) > 0  then
                   Memo1.Lines.add('Receive: ' + TmpStr1 ) ;

              End;
          end;


      end;
      // Behandlung der HTTP Anfrage
      if FileExists(GetCurrentDir + '/WebDocs' + Path) then
        begin
          RequestFile.LoadFromFile(GetCurrentDir + '/WebDocs' + Path);
          ClientSocket.Sendln('HTTP/1.0 200 OK');
          ClientSocket.Sendln('');
          ClientSocket.Sendln(RequestFile.Text);
          ClientSocket.Close;
          RequestFile.Clear;
          Exit;
        end
      Else
      if Not FileExists(GetCurrentDir + '/WebDocs' + Path) then
        begin
          Form1.memo1.lines.add('ERROR : 404 Page Not Found : <<'+ Path + '>>');
          RequestFile.LoadFromFile(GetCurrentDir + '/Err/' + '404.html');
          ClientSocket.Sendln('HTTP/1.0 404 Not Found');
          ClientSocket.Sendln('');
          ClientSocket.Sendln(RequestFile.Text);
          ClientSocket.Close;
          RequestFile.Clear;
          Exit;
        end;
    end;
  RequestFile.Free;

end;

end.

mjustin 12. Dez 2022 11:38

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Woher kommt TTCPServer, ist das die Klasse TTcpServer aus Delphi 6?

https://stackoverflow.com/a/26049268/80901

Falls ja, würde ich wie in der Antwort vorgeschlagen auf Indy, ICS oder Synapse (oder mORMot) umstellen.

joehd 12. Dez 2022 11:47

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Zitat:

Zitat von mjustin (Beitrag 1516075)
Woher kommt TTCPServer, ist das die Klasse TTcpServer aus Delphi 6?

https://stackoverflow.com/a/26049268/80901

Falls ja, würde ich wie in der Antwort vorgeschlagen auf Indy, ICS oder Synapse (oder mORMot) umstellen.

Hallo !
Das ist aus Delphi 2007 das war der einfachste weg für mich.
Ich stelle mir vor ich muss nur noch die richtige Antwort geben und den Stream herausfinden ... Das was gesendet wird ist einfache Strings ...
Mein Problem war auch ich bin mit der Indy und dem TID Server 0 zurecht gekommen :-( da bin ich dann zum guten alten D2007 übergegangen ...

mjustin 12. Dez 2022 12:02

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Zitat:

Zitat von joehd (Beitrag 1516076)
Das ist aus Delphi 2007 das war der einfachste weg für mich.
Ich stelle mir vor ich muss nur noch die richtige Antwort geben und den Stream herausfinden ... Das was gesendet wird ist einfache Strings ...
Mein Problem war auch ich bin mit der Indy und dem TID Server 0 zurecht gekommen :-( da bin ich dann zum guten alten D2007 übergegangen ...

Mit dem Indy HTTP Server (oder Synapse etc.) wäre es einfacher zu lösen, der Code wäre wesentlich lesbarer und robuster. Es finden sich dazu mehr Codebeispiele im Internet, und mehr Entwickler, die ihn einsetzen, können bei Fragen helfen.

Das liegt möglicherweise auch daran:
Zitat:

TTcpClient and TTcpServer were originally introduced in Delphi 6 as a cross-platform socket solution for Kylix (which is a dead product). They were removed from Delphi in XE6, downgraded to demo status, not even official components anymore.
Zitat:

In my opinion, TTcpClient and TTcpServer are horrible components, you should stay away from them. (...) They are very difficult to work with, have bad error handling, and are not very flexible to use.

joehd 12. Dez 2022 12:28

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Eigentlich habe ich ja schon dinge in Indy gemacht ...
Gibt es sorry wenn ich so frage ein Beispiel für POST JSON mit der Indy Server componente...
Ich habe schon so viel durchgesucht ...

Ich stelle mir das so vor Verbindung herstellen, Stream anbinden und daten erhalten ... Daten Parsen .... aber ich hänge voll ...

Danke schon mal

himitsu 12. Dez 2022 13:18

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Den Input liest du ja bereits (HTTP-Header) ... danach kommt eine Leerzeile und dann die Daten (von deinem POST)


Nicht nur, dass dir eine HTTP-Komponente vieles abnimmt (Header parsen/lesen und beim Senden auch generieren)
auch für HTTP/2 und HTTP/3, also z.B. HTTPS oder zukünftig QUIC müsstest du dann nichts selber bauen, weil sowas dann ja von Anderen eingebaut würde.
PS: Mit HTTP/3 überlegt man sich von TCP auf UDP umzustellen. (ja, die ersten Webseiten und Browser können es schon ... testweise)
https://www.stackscale.com/blog/http3/


Die HTTP-Komponente gibt dir einmal eine Header-Liste und auch die entsprechenden Streams vom Content (Input) und Response (zum Senden).

joehd 12. Dez 2022 16:35

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Danke für die Hinweise ich sollte es dann sicher noch umstellen aber jetzt brauche ich eine schnelle Lösung für das Problem. Ich dachte die TMS Webcore kann FTP oder einfaches SMTP um die daten aus dem Webserver zu versenden aber nein. Ich muss HTTP Post machen und da habe ich nicht mit gerechnet. Und ich habe mich mit REST und HTTP Zeugs und so noch nicht wirklich beschäftigt. :-(

Zum Auslesen des Header ich denke auch das ich alles auslese aber da sind keine Daten, die müssten dann ja im TMEMO stehen
Aber leider finde ich in dem Header die Daten nicht.
Aber eigentlich lese ich doch alles aus.

Kann es sein das die Sende Komponente noch was benötigt?
Die Komponente ist die WebhttpRequest von TMS Web Core

Kann es sein das ich da die schleife zu früh beende du sagtest es kommt eine Leerzeile ?
Delphi-Quellcode:
********if RequestHeader.Strings[i] = ''*then
**********begin
************Sleep(100);
************Continue;
**********end;
Delphi-Quellcode:
sendstring := 'Data: ||' + PNName.Text +'||'+  pVName.Text + '||'+ pGebdat.Text+'||' +Bemerkung.text + '||'+ freitext.text;

 form1.WebHttpRequest1.URL := 'http://127.0.0.1:8080/Kontakt/index.html';
 form1.WebHttpRequest1.Command := httpPOST;
 form1.WebHttpRequest1.PostData := sendstring;
 form1.WebHttpRequest1.Execute();

joehd 12. Dez 2022 16:53

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Ich glaube mein
Delphi-Quellcode:
    RawData := ClientSocket.Receiveln; // Liest nur bis zum Zeilenede aus ggf nicht alles
    Rawdata := Clientsocket.ReceiveFrom() // das gibt es noch aber da ist mir nicht klar wie ich die Werte alle bekomme

  function TIpSocket.ReceiveFrom(var buf; bufsize: Integer; ToAddr: TSockAddr; var len: Integer; flags: Integer): Integer;

buf ist klar (String/char Buffer ) aber Bufsize müsste ich doch vom Server bekommen ?  toaddr ist das meine Lokale ? .....

himitsu 12. Dez 2022 16:55

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Zitat:

Zitat von joehd (Beitrag 1516085)
Kann es sein das ich da die schleife zu früh beende du sagtest es kommt eine Leerzeile ?

Ja und nein.

Du brichst vorher schon ab, da wo der Header ended.

Zitat:

Delphi-Quellcode:
while RawData <> '' do


joehd 12. Dez 2022 17:09

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Zitat:

Zitat von himitsu (Beitrag 1516087)
Zitat:

Zitat von joehd (Beitrag 1516085)
Kann es sein das ich da die schleife zu früh beende du sagtest es kommt eine Leerzeile ?

Ja und nein.

Du brichst vorher schon ab, da wo der Header ended.

Zitat:

Delphi-Quellcode:
while RawData <> '' do


while Rawdata <> eof() ? ich brauche ja eine Ende markierung.
Stimmt aber ich hatte es nur weiter unten versucht weiter auszulesen das geht aber nicht da ich da ja schon abbreche

Die Größe der Empfangenen Bytes kann ich ermitteln
Statusbar1.SimpleText := inttostr(Clientsocket.BytesReceived); // = 490 Bytes
diese könnte ich dann ja auslesen oder ?

mytbo 12. Dez 2022 19:09

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Zitat:

Zitat von joehd (Beitrag 1516085)
Und ich habe mich mit REST und HTTP Zeugs und so noch nicht wirklich beschäftigt. :-(

Im Forum gibt es Artikel zur Einführung in Interface-based und methodenbasierte Services. Sie enthalten lauffähige Beispiele. Der methodenbasierte Service SaveFile aus dem Beispiel wird mit TMS WebCore wie folgt aufgerufen:
Delphi-Quellcode:
const
  REQUEST_PATH = 'SaveFile?fileName=%s';
begin
  HTTPRequest.URL := Format(BASE_URL + REQUEST_PATH, [pmcFileName]);
  HTTPRequest.Command := httpPUT;
  HTTPRequest.PostData := ...;
  HTTPRequest.Execute(
    procedure(pmResponse: String; pmRequest: TJSXMLHttpRequest)
    begin
      if pmRequest.Status = 200 then
        ShowMessage(Format('File %s was saved.', [pmcFileName]))
      else
        ShowMessage('Error: File was not saved.');
    end);
end;
Bis bald...
Thomas

joehd 13. Dez 2022 10:39

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Danke
ich baue das mit dem Senden und der / Meldung / Fehlermeldung mal ein aber das löst leider mein Empfangsproblem nicht :-(

joehd 13. Dez 2022 15:22

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Zitat:

Zitat von himitsu (Beitrag 1516087)
Zitat:

Zitat von joehd (Beitrag 1516085)
Kann es sein das ich da die schleife zu früh beende du sagtest es kommt eine Leerzeile ?

Ja und nein.

Du brichst vorher schon ab, da wo der Header ended.

Zitat:

Delphi-Quellcode:
while RawData <> '' do


Daran liegt es leider nicht das da nichts mehr kommt .... DEr Puffer ist leer und vollständig gelesen. Ich denke es braucht ein response das der Post gesendet wird ...

joehd 28. Dez 2022 17:36

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Hallo also nachdem ich doch so nett gebeten wurde das mit INDY zu machen habe ich jetzt mal die idHTTPServer genutzt.
Alles von neuem. Ich habe mir einige Beispiele angeschaut aber schon beim empfangenen Option Command stellt sich die Frage wie gebe ich den Send zurück.

Aresponseinfo.ResponseText := 'HTTP/1.0 200 OK';

klappt nicht und ich habe schon einiges Probiert

Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandOther(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
 // arequestinfo.URI angeforderte Seite
 // arequestinfo.Command komando welches gegeben wurde get Post ....
 // arequestinfo.Document Seiteninfoi nach der Domain
 // arequestinfo.Host
 // arequestinfo.From aufrufende Adresse

 memo1.Lines.Add('CommandGet: URI: ' + arequestinfo.URI + ' | Command: '+ arequestinfo.Command + ' | PostStream: ' + mystreamtostring(arequestinfo.PostStream)) ;
 memo1.Lines.Add('Document: ' + arequestinfo.Document + ' | Params: ' + arequestinfo.Params.Text + ' | Host: ' + arequestinfo.Host + ' | From: ' + arequestinfo.From );
 memo1.Lines.Add(' Konnektion: ' + arequestinfo.Connection   );

if arequestinfo.Command = 'OPTIONS' then
Begin // Abfrage des WEB Servers was kannst du
  Aresponseinfo.ResponseText := 'HTTP/1.0 200 OK';
  memo1.Lines.Add('Options : ' +'HTTP/1.0 200 OK');
End;

end;

HolgerX 28. Dez 2022 18:41

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Hmm..

wieso nicht einfach :

Delphi-Quellcode:
ResponseInfo.ResponseNo = 200;


Der Responsetext ist für die Rückgabedaten...

joehd 29. Dez 2022 08:57

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Guter Tipp, das probiere ich doch gleich mal aus ....
ich bin gerade mal voll der Anfänger mit der Komponente.
Der Sender bricht auf jeden Fall derzeit ab, weil falsche Antwort :-( Ich probiere dein Vorschlag ... DANKE

Ich versuche gerade mal den Port mit etwas zu tracen das ich sehe was da eigentlich passiert...

Olli73 29. Dez 2022 09:07

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Mach doch einfach Mal in Delphi Datei -> Neu -> Weitere -> Delphi-Projekte -> WebBroker -> Web Server Anwendung.

Dann kannst du im WebModule einfach "Actions" anlegen und dort die Daten verarbeiten...

Und bedenke, dass ein Webserver mehrere Anfragen gleichzeitig abarbeiten kann; deshalb arbeitet Indy an der Stelle multithreaded. Auf die Oberfläche oder globale Variablen zuzugreifen ist also nicht so dolle (im WebModule).

joehd 29. Dez 2022 09:26

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Danke für den Tipp da hatte ich auch schon probiert,
aber ich empfange nur komplette Datensätze aus einem Formular so hoffe ich Json und die werden dann abgelegt oder so komplett verarbeitet. Dann ist die Verbindung schon wieder vorbei.

Olli73 29. Dez 2022 09:28

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Sollte aber mit Obigem einfach umsetzbar sein.

joehd 30. Dez 2022 13:06

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Hallo !
also mein Projekt schreitet voran. Für das automatische aufbauen der Verbindung kann man den Parameter AutoStartSession nutzen. Dann wird der erste Kram erstmal erledigt.. so hoffe ich ...
Kann mir jemand sagen an was das liegt ?
Grüße
Joachim

Mein Formular liegt hier
https://__url__/Kontaktform.html

Delphi-Quellcode:
 form1.WebHttpRequest1.URL := 'http://___url___/kontakt/index.html'+'?'+ sendstring;
 form1.WebHttpRequest1.User := 'Webseite';
 form1.WebHttpRequest1.Password := 'nopassword';
 form1.WebHttpRequest1.Command := httpPost; // httpPUT; // httpPOST;
 // Form1.WebHttpRequest1.Headers.AddPair('Content-Type', 'application/x-www-form-urlencoded');
 // Form1.WebHttpRequest1.Headers.Add('Accept', 'application/json');
 Form1.WebHttpRequest1.Headers.AddPair('Content-Type', 'application/json');
 // Form1.WebHttpRequest1.Headers.Add('Access-Control-Allow-Origin','*');
 form1.WebHttpRequest1.PostData := ''; // sendstring;
 // form1.WebHttpRequest1.Execute;
 form1.WebHttpRequest1.Execute;
 Form1.Responsememo.Text := 'Fertig Ihre Anforderung wurde übertragen.'
Wenn ich nun das Formular bei mir Lokal mit dem TMS web, Server laufen lasse, dann kommt beim Kunden auch was an. Wen ich die Seite aber auf den Webserver Hochlade, dann sendet er nicht mehr und wird geblockt.

Meldung im Browser öffentlicher Web server
Laden von gemischten aktiven Inhalten "http://__url__/kontakt/index.html?&PNNAME=MusterFrau&PVNAME=Musterine&PGE BDAT=01.01.1900&PTEL=06221138890&PBEMERK=Termin%20 Kardiologie&PFREITEXT=Bitte%20beschreiben%20sie%20 n%C3%A4her,%20um%20was%20es%20geht!&VERSICHERT=KAS SE&PD1=Termin&PD2=&PD3=Kardiologie&Position=" wurde blockiert.
Kontaktform.js:1:453326

meldung im Browser Lokaler Webserver TMS web server
Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf http://__url__/kontakt/index.html?&P...usen&Position=. (Grund: CORS-Anfrage schlug fehl). Statuscode: (null).

Olli73 30. Dez 2022 14:07

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Nun ja, das Formular liegt hier "https://___url__/" und der Zielserver hier "http://___url___/".

Das sind gleich 3 Gründe, warum das nicht geht. Denn das Protokoll, die (Sub-)Domain und der Port müssen gleich sein. Oder du musst CORS entsprechend konigurieren.

Olli73 30. Dez 2022 14:42

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
setz mal in deinem HTTP-Server bei der Anfrage das hier:

Response.SetCustomHeader('Access-Control-Allow-Origin', '*');

joehd 1. Jan 2023 23:23

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Zitat:

Zitat von Olli73 (Beitrag 1516807)
Nun ja, das Formular liegt hier "https://__url1__/" und der Zielserver hier "http://___url2__/".

Das sind gleich 3 Gründe, warum das nicht geht. Denn das Protokoll, die (Sub-)Domain und der Port müssen gleich sein. Oder du musst CORS entsprechend konfigurieren.

Hallo erst mal Danke für die Antwort.

Ist es nicht immer so das ich von einem Laufenden Server auf einen anderen Server Daten bringe ?
Was wäre denn der richtige bessere Weg die daten von einem öffentlichen Server auf einen Lokalen Empfänger zu bringen ?

Wie kann ich den CORS Konfigurieren ?


Die Einstellung / Parameter Response.SetCustomHeader('Access-Control-Allow-Origin', '*'); habe ich weder bei Get not bei others beim Indy idhttp server gefunden. Wenn ich mit INDY und dem Set suche finde ich auch nichts :-(

Danke !

TMS hat mir folgendes geschrieben : ( und ich habe Ihnen die Konstallation geschrieben )
It will depend on what your server returns for this post request. The event WebHttpRequest.OnRequestResponse will return this data via ARequest object or AResponse:string if this is a text response.

Olli73 2. Jan 2023 06:22

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Das SetCustomHeader scheint es nur via WebBroker zu geben. Aber schau Mal nach AResponse.CustomHeader.Add(...).

joehd 2. Jan 2023 09:14

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Da habe ich es mal reingesetzt aber der Syntax ist wohl anders ...
ich werde jetzt mal das Formular versuchen auch auf dem Webserver wo die Antwort hin geht zu hosten ...
Aber das TMS mir nicht geschrieben hat das es ein Problem ist von Server a nach Server B ein Post zu senden finde ich krass. Und ich habe support bei denen ... traurig ...

Ich danke dir sehr und halte euch auf dem laufenden ...

Olli73 2. Jan 2023 09:18

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Also bei mir hat das aus Post #22 geholfen.

Wenn du beides auf dem gleichen Server hostest, hast du aber immer noch unterschiedliche Ports?

joehd 2. Jan 2023 11:25

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Zitat:

Zitat von Olli73 (Beitrag 1516860)
Also bei mir hat das aus Post #22 geholfen.

Wenn du beides auf dem gleichen Server hostest, hast du aber immer noch unterschiedliche Ports?

Post #22 werde ich nochmal bearbieten
( ich habe mir das deutlich leichter vorgestellt, immerhin die Daten hätte ich ja schon mal nur noch die Webseite ebenfalls senden ? )

Unterschiedliche Ports : nein es wären dann ja die gleichen Ports ich kommuniziere mit dem Webserver über 8080
sollte dann eigentlich gehen . Jetzt bekomme ich den Stream aber nicht rüber

Delphi-Quellcode:
   
if Fileexists(bfilename) then
     begin // 
      memo1.Lines.Add('File gefunden nun senden ');

   if LowerCase(ExtractFileExt(afilename)) = '.html' then
      begin
        //AResponseInfo.ResponseNo := 200;
        //aresponseinfo.WriteContent;
        filestr1 := tfilestream.Create(bfilename,fmopenRead or fmsharecompat);      // Tfilestream
        memo1.Lines.Add('Size :' + inttostr(filestr1.Size));
        Aresponseinfo.ContentStream := filestr1 ; // tfilestream.Create(bfilename,fmopenRead or fmsharecompat);
        aresponseinfo.ContentLength := filestr1.Size;    // da ist was da also größer 0
        // aresponseinfo.WriteHeader;
        aresponseinfo.WriteContent;
        AResponseInfo.ContentStream.Free;
        AResponseInfo.ContentStream := nil;
       end;
    if not AResponseInfo.HeaderHasBeenWritten then
      begin
      // set error code
        AResponseInfo.ResponseNo := 404;
        aResponseInfo.ResponseText := 'Document not found';
        // write header
        AResponseInfo.WriteHeader;
      end;
    // return content
      AResponseInfo.ContentText := 'The document requested is not availabe.';
      AResponseInfo.WriteContent;
     end;

joehd 2. Jan 2023 11:29

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Olli73 (Beitrag 1516809)
setz mal in deinem HTTP-Server bei der Anfrage das hier:

Response.SetCustomHeader('Access-Control-Allow-Origin', '*');

ich lade hier den Source mal hoch vielleicht fällt jemandem was dazu ein es ist wirklich furchtbar und ich habe das Internet schon wund gesucht ..

Olli73 2. Jan 2023 15:43

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Ehrlich gesagt werde ich aus deinem Programmcode (Testprojekt) nicht schlau. Was soll das Programm machen und wo ist das Problem?

Olli73 2. Jan 2023 16:38

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, probiere mal das beigefügte Beispiel mit dem Aufruf im Browser: http://localhost:8080/kontakt.html

Alles quick and dirty weitergemacht...

joehd 2. Jan 2023 18:53

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Zitat:

Zitat von Olli73 (Beitrag 1516874)
So, probiere mal das beigefügte Beispiel mit dem Aufruf im Browser: http://localhost:8080/kontakt.html

Alles quick and dirty weitergemacht...

Also Oli deinem Hinweis mit 2 Server und alles 1 Page und so dem bin ich dann auch mal nachgegangen und habe den "Server" mal aufgebohrt .... und ja das scheint auch ein große Hürde zu sein. Ich schau mir gleich mal dein / mein / unser Quick und dirty an :-)
Danke schon mal !

joehd 2. Jan 2023 19:19

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja Cool ! ich habe wie schon geschrieben deinem Hinweis auch gefolgt.
Jetzt sieht das Bild / Seite nur noch etwas blöd aus Umlaute Problem ...
Aber sonst scheint es zu funktionieren jetzt muss nur noch das Dirty weg ;-)

Aber ich finde es schon komisch das man nicht auf einen anderen Server schicken kann .... Aber das ist sicher einer Sicherheit geschuldet. Ich habe früher auch lustig andere Programme gesteuert das ist auch nicht mehr so einfach ...

Ah und du hast den Json auf das lokale Verzeichnis geschrieben ... OK

Seit ich den Server Testweise immer mal an habe werfen sich die Häcknudeln wie Fliegen aufs Fleisch aber sie bekommen ja nix zurück ... Aber was da alles probiert wird. unglaublich.

Danke an die Community und die tolle Unterstützung. Top

ich arbeite mal noch verschiedenes ein ;-)

Wie beeinflusse ich denn den Zeichensatz in Label?
Wenn das mal läuft, dann ....
Als weitere Schwierigkeit werde ich dann mal noch ein Unterschriftenfeld mit einpflegen ... Mal sehen wie das wird.

Olli73 2. Jan 2023 20:19

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Also das mit verschiedenen Servern geht auch. Wenn ich (nur) das hier in "CommandOther" reintue, dann geht das:

Delphi-Quellcode:
  aresponseinfo.CustomHeaders.AddValue('Access-Control-Allow-Origin', '*');
  aresponseinfo.CustomHeaders.AddValue('Access-Control-Allow-Headers', '*');
  aresponseinfo.WriteHeader;

joehd 3. Jan 2023 21:35

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Olli73

das werde ich doch gleich auch nochmal probieren. Das wäre mir auch sympathischer muss ich gestehen ich möchte ungern meinen Webserver als Formular Webserver nutzen ....
vielen Dank dir ...
ich werde dir mein fertiges Projekt per PN mal schreiben ... und hier den Quellcode des Servers, denn ich denke, das Problem gibt es öfter und ich habe mir wirklich im Internet 'nen Wolf gesucht .. Ich muss es nur noch besser Dokumentieren und etwas entschlacken ;-)
DANKE

joehd 10. Jan 2023 10:41

AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
 
Hallo
an wenn wende ich mich oder wie mache ich es selbst den Link des Aufrufs zu ändern ? bzw unkenntlich zu machen ?
also die URL ? Da google das nun in der suche findet ... :-(
DAMNKE


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