per http mit Webserver kommunizieren

Alle Fragen zur Netzwerkkommunikation
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

per http mit Webserver kommunizieren

Beitrag von RSE »

Hi!

Wie kann ich am einfachsten per http mit einem Webserver kommunizieren?

Was ich genauer vorhabe:
Ich möchte Formulardaten per POST-Methode an einen Webserver übertragen, so dass der Server nicht merkt, dass sie nicht von der eigenen Website kommen. Im Prinzip geht es um eine einmalige Formular-Automation.

1. Idee - Fernsteuerung einer Browserengine:
Mein Programm erzeugt eine html-Datei, übergibt diese an den Browser und schickt das darin enthaltene HTML-Formular an den Webserver ab.
Problem:
Bei einer ersten (noch nicht allzu intensiven) Recherche hat sich mir der Eindruck gebildet, dass Firefox nicht problemlos und einfach ohne zusätzliche Installationen fernsteuerbar oder integrierbar ist. Der Internet Explorer ist dagen sehr gut über OLE fernsteuerbar, aber ist das aus Lazarus heraus einfach nutzbar (laufen soll das ganze sowieso nur für mich unter Windows)?

2. Idee - Eigene Implementation von http:
Erscheint mir insgesamt relativ aufwendig für den einmaligen Einsatzzweck. Vielleicht aber einfacher als oben genannte Ansätze, da http ja textbasiert ist. Wie einfach lassen sich die IP-Verbindungen mit Lazarus aufbauen?

Wer hat noch andere bzw. einfachere Ansätze für diese einmalige Aufgabe?

MfG
RSE

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: per http mit Webserver kommunizieren

Beitrag von monta »

Also ich denk ja, beide Ansätze sind etwas zu aufwendig ;)

Du kannst einfach auf eine der Netzwerkbibliotheken zugreifen. Beispielsweise Synapse bietet dir sehr leicht eine Post-HTTP-Get-Abfrage an. Vorteil von Synapse, du musst nur schnell die Unit einbinden und fertig.

Aus der Doku von Synapse:
function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;

A very useful function, and example of use can be found in the THTTPSend object. It implements the POST method of the HTTP protocol. This function is good for POSTing form data. It sends the POST method for a URL document to an HTTP server. You must prepare the form data in the same manner as you would the URL data, and pass this prepared data to "URLdata". The following is a sample of how the data would appear: 'name=Lukas&field1=some%20data'. The information in the field must be encoded by EncodeURLElement function. The returned document is in the "Data" stream. Returns boolean TRUE if all went well.


(http://www.ararat.cz/synapse/doku.php/download)
Johannes

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: per http mit Webserver kommunizieren

Beitrag von RSE »

Sieht auf den ersten Blick schon mal sehr gut aus! So etwas hatte ich mir erhofft ;-)

Danke!
RSE
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: per http mit Webserver kommunizieren

Beitrag von marcov »

Es gibt mehrere, auch noch Indy und (fuer Windows) ICS.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: per http mit Webserver kommunizieren

Beitrag von RSE »

Danke, aber Synapse ist wunderbar einfach und absolut ausreichend. Ich bin schon fast fertig (hab viel anderes zwischendurch gemacht :wink: ).
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: per http mit Webserver kommunizieren

Beitrag von Maik81ftl »

Moin Moin,

mal nach 3 Jahren hier eine Frage reinschieb.

Code: Alles auswählen

unit main; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, lclintf,
  SynMemo, IpHtml, Ipfilebroker, lNetComponents, lhttp, lNet;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    IpFileDataProvider1: TIpFileDataProvider;
    IpHtmlPanel1: TIpHtmlPanel;
    IPS1: TLTCPComponent;
    IPSHTTP1: TLHTTPClientComponent;
    SynMemo1: TSynMemo;
    procedure FormShow(Sender: TObject);
    procedure IPS1Connect(aSocket: TLSocket);
    procedure IPS1Disconnect(aSocket: TLSocket);
    procedure IPSHTTP1Disconnect(aSocket: TLSocket);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
procedure HTMLStringToHtmlPanel(const HTMLString:String; var HTMLPanel:TIpHtmlPanel);
var
  html:TIpHtml;
  ms:TMemoryStream;
  StrList:TStringList;
begin
  StrList:=TStringList.Create;
  StrList.Text:=HTMLString;
 
  ms:=TMemoryStream.Create;
  StrList.SaveToStream(ms);
  ms.Position:=0; // Von entscheidender Bedeutung, sonst geht es nicht(Vielleicht ein BUG in der LCL bzw. von  TStream bzw. von TStringList.
 
  html:=TIpHtml.Create;
  html.LoadFromStream(ms);
  HTMLPanel.SetHtml(html);
  ms.Free; StrList.Free;
end;
 
{ TForm1 }
 
procedure TForm1.Formshow(Sender: TObject);
var Port : integer;
    ServerIP : String;
    Verbindungsaufbau : boolean;
begin
  ServerIP := '192.168.178.100';
  Port     := 80;
  Verbindungsaufbau := IPS1.Connect(ServerIP,Port);
  if not Verbindungsaufbau then Close;
  IPSHTTP1.Host:= ServerIP;
  if IPSHTTP1.Connect then caption:= 'ich Seh den IPS' else Caption:= 'wo ist der IPS?';
end;
 
procedure TForm1.IPS1Connect(aSocket: TLSocket);
begin
  Synmemo1.Lines.LoadFromFile('ips.htm');
  HTMLStringToHtmlPanel(SynMemo1.Lines.Text,IpHtmlPanel1);
end;
 
procedure TForm1.IPS1Disconnect(aSocket: TLSocket);
begin
  IPS1.Disconnect(True);
end;
 
procedure TForm1.IPSHTTP1Disconnect(aSocket: TLSocket);
begin
  IPSHTTP1.Disconnect(True);
  IPS1Disconnect(aSocket);
end;
 
end.


Das Positive ist schon mal, das des Gerät schon mal ein Ja bekommt. :D und das iphtmlpanel läd die externe file. nun bekomm ich allerging den Befehl nicht geschalten. muß ich da beim tcl oder beim html element den Sendebefehl schicken?

Gruß Maik
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: per http mit Webserver kommunizieren

Beitrag von af0815 »

Maik81ftl hat geschrieben:

Code: Alles auswählen

ms:=TMemoryStream.Create;
  StrList.SaveToStream(ms);
  ms.Position:=0; // Von entscheidender Bedeutung, sonst geht es nicht(Vielleicht ein BUG in der LCL bzw. von  TStream bzw. von TStringList.
 


Nein ist kein Bug. Das SaveToStream bewegt den Zeigen an das Ende des Buffers. Jeder weitere Zugriff muß daher mit eine EOF enden. Damit man wieder an den Anfang kommt, ist das Positionieren auf den Anfang ( ms.Position:=0;) notwendig. Ist halt eine Logiksache, es wird genau das gemacht was man gesagt hat, nicht das was man ev. gemeint hat :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: per http mit Webserver kommunizieren

Beitrag von Maik81ftl »

af0815 hat geschrieben:
Maik81ftl hat geschrieben:

Code: Alles auswählen

ms:=TMemoryStream.Create;
  StrList.SaveToStream(ms);
  ms.Position:=0; // Von entscheidender Bedeutung, sonst geht es nicht(Vielleicht ein BUG in der LCL bzw. von  TStream bzw. von TStringList.
 


Nein ist kein Bug. Das SaveToStream bewegt den Zeigen an das Ende des Buffers. Jeder weitere Zugriff muß daher mit eine EOF enden. Damit man wieder an den Anfang kommt, ist das Positionieren auf den Anfang ( ms.Position:=0;) notwendig. Ist halt eine Logiksache, es wird genau das gemacht was man gesagt hat, nicht das was man ev. gemeint hat :-)


thx af0815 für die antwort, ist aber nicht wirklich das, was ich meine. das was du hier beschrieben hast, ist nur das, was ich anderen Bsp. Übernommen habe. das ich die Komentare hierbei drinne lasse, Spielt da eine Untergeordnete Rolle.

Der hintergrund dieser Anwendung schaut wir folgt aus.

  • Laden der Anwendung als ersatz eines Browsers inkl. der file, welche die Oberfläche des IPS 1 Darstellt.
  • beim Ausführen der Befehle

    Code: Alles auswählen

    <input name="Ein" type="submit" value="Ein">&nbsp;</td>
    bzw

    Code: Alles auswählen

    <input name="Aus" type="submit" value="Aus">&nbsp;
    Schalten des IPS 1 in den entsprechenden Zustand.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: per http mit Webserver kommunizieren

Beitrag von af0815 »

Vielleicht hilft dir ein Beitrag aus den Themen Webserver abfragen oder HTML-Seite laden und parsen. Du willst meiner Meinung nach parsen und anschliessend ein passende Änderung an den Webserver schicken.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: per http mit Webserver kommunizieren

Beitrag von Maik81ftl »

af0815 hat geschrieben:Vielleicht hilft dir ein Beitrag aus den Themen Webserver abfragen oder HTML-Seite laden und parsen. Du willst meiner Meinung nach parsen und anschliessend ein passende Änderung an den Webserver schicken.


Kann mir zugegeben nur Sehr Schwer vorstellen, das ich auf diese ART einen µC steuern kann, wenn ich nur die Info's Parse. und wenn ich Parsen recht verstehen heist das soviel wie Auslesen.

wenn dem so ist, wäre das Ganeu das gegenteil, von dem was ich will. ich Brauche den Direkten Hardware-zugriff über das Port 80 / Port 23.

Folgende File liefert die HTML, welche auch direkt auf dem IPS 1 beschrieben ist.
_ips.htm.zip
IPS 1.cgi as html
(862 Bytes) 81-mal heruntergeladen
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: per http mit Webserver kommunizieren

Beitrag von af0815 »

Maik81ftl hat geschrieben:wenn dem so ist, wäre das Ganeu das gegenteil, von dem was ich will. ich Brauche den Direkten Hardware-zugriff über das Port 80 / Port 23.

Folgende File liefert die HTML, welche auch direkt auf dem IPS 1 beschrieben ist.
_ips.htm.zip

Was steckt auf dem IPS 1 hinter dem Port ? Nichts oder ein Server.

Momentan erscheint es mir als hättest du lokal ein Webformular geöffnet und willst aber die Formulardaten an einen auf dem Gerät nicht vorhandenen Server schicken.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: per http mit Webserver kommunizieren

Beitrag von Maik81ftl »

af0815 hat geschrieben:Was steckt auf dem IPS 1 hinter dem Port ? Nichts oder ein Server.

Momentan erscheint es mir als hättest du lokal ein Webformular geöffnet und willst aber die Formulardaten an einen auf dem Gerät nicht vorhandenen Server schicken.


nun das bei dir nix angezeigt wird, liegt daran, das Dieser Netzwerkschalter bei mir im Netzwerk steht. nach einem Scan unter Linux hab ich rausbekommen, das der mit 2 offenen Ports arbeitet.

Aber wenn ich dich grad recht verstehe, muß ich direkt die File, von dem Server öffnen und Schalten?!

Mehr zu dem Gerät findest du/ihr hier http://www.elv.de/output/controller.asp ... ch=&marke=
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: per http mit Webserver kommunizieren

Beitrag von af0815 »

Laut Beschreibung hat der einen kleinen, paßwortgeschützen Webserver drauf. Das Lazarusprogramm muß also einen Client nachstellen.

Vorgang: Webseite öffnen, passwortcheck erledigen und anschliessend Seite lesen. Dann erkenne in welchen Zustand sich der IPS befindet (ist also parsen der Webseite) und anschliessend die Antwort im gewünschten Format senden. Falls die Seite sehr einfach aufgebaut ist, brauchst du nach einer Verbindung ja nur die richtige Antwort direkt zu senden - wenn es wirklich nur um Ein/Aus geht ohne Statuscheck.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: per http mit Webserver kommunizieren

Beitrag von Maik81ftl »

af0815 hat geschrieben:Laut Beschreibung hat der einen kleinen, paßwortgeschützen Webserver drauf. Das Lazarusprogramm muß also einen Client nachstellen.

Vorgang: Webseite öffnen und lesen. Dann erkenne in welchen Zustand sich der IPS befindet (ist also parsen der Webseite) und anschliessend die Antwort im gewünschten Format senden. Falls die Seite sehr einfach aufgebaut ist, brauchst du nach einer Verbindung ja nur die richtige Antwort direkt zu senden - wenn es wirklich nur um Ein/Aus geht ohne Statuscheck.


Genau darum geht's mir ehrlich gesagt auch. Zustand ist Uninteressant, da ein Interner Timer (nach max 30 min.) den IPS wieder ausschalten. sogesehen, brauch ich Ihm nur sagen, das er Einschalten soll. und wie die Seite ausgebaut ist, kannst dir ja anschauen. cgi hab ich als HTML zip schon gepostet.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: per http mit Webserver kommunizieren

Beitrag von af0815 »

Schick dem IPS mal einfach '..../ips.cgi?pg=ips&Ein=Ein' über den Broswer. die Punkte ersetze mit der genauen Adresse des IPS. Wird wohl wie http://192.168.178.100/ips.cgi?pg=ips&Ein=Ein oder http://192.168.178.100/ips.cgi?pg=ips&Aus=Aus ausehen. Wenn es geht so ist das genau der String den du dann im Programm senden musst, wenn nicht die Authentifizierung dazwischenspukt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten