![]() |
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: ![]() Origin: ![]() 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. |
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?
![]() Falls ja, würde ich wie in der Antwort vorgeschlagen auf Indy, ICS oder Synapse (oder mORMot) umstellen. |
AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
Zitat:
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 ... |
AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
Zitat:
Das liegt möglicherweise auch daran: Zitat:
Zitat:
|
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 |
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) ![]() Die HTTP-Komponente gibt dir einmal eine Header-Liste und auch die entsprechenden Streams vom Content (Input) und Response (zum Senden). |
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(); |
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 ? ..... |
AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
Zitat:
Du brichst vorher schon ab, da wo der Header ended. Zitat:
|
AW: Ich habe einen TCPServer als HTTP server und möchte daten aus einem POST JSON Da
Zitat:
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 ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 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