AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IdHTTPServer-control hätte gerne zusätzliches Info
Thema durchsuchen
Ansicht
Themen-Optionen

IdHTTPServer-control hätte gerne zusätzliches Info

Ein Thema von ArrayOf.. · begonnen am 17. Sep 2003 · letzter Beitrag vom 30. Sep 2003
Antwort Antwort
ArrayOf..

Registriert seit: 7. Sep 2003
50 Beiträge
 
Delphi 7 Personal
 
#1

IdHTTPServer-control hätte gerne zusätzliches Info

  Alt 17. Sep 2003, 18:31
Hallo,

ich möchte mit einem WebBrowser-control eine HTML-Seite laden und zwar dieses von einem IdHTTPServer-control, welches ebenfalls Bestandteil des gleichen Programmes ist (sich aber auf einer anderen Form befndet). Bevor der IdHTTPServer1 nun jedoch antwortet, benötigt dieser noch eine zusätzliche Information nach der er diese abzusendende HTML-Page jeweils zuerst noch kurz modifiziert.

Wie, und das wäre dazu jetzt die kurze Frage, wie kann der WebBrowser1 dieses noch bei seinem eigentlichen Page-Request bewerkstelligen? Ist es vielleicht möglich, dass er dazu einen der variablen Parameter im OnBeforeNavigate2-Eventhandler (des WebBrowser-controls) beläd? (Ich nehme hier nicht den direkten Methodenaufruf BeforeNavigate(.....) sondern den Eventhandler, weil das Ganze nachher auch beim Laden von einzelnen Frames eines FrameSets funktionieren soll).

Also, der Kopf des Eventhandlers sieht ja dabei so aus:

procedure TForm2.WebBrowser1BeforeNavigate2(ASender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);

Könnte man hier also eventuell Daten in die Variable 'PostData' oder 'Headers' eintragen, die dann auch im 'ARequestInfo' des IdHTTPServer1 mit ankämen und die dieser dort zuerst auslesen könnte? Wenn ja, welche Daten könnten hier geladen werden, bzw. wie müsste das eventuell aussehen, um dass man das z.B. dann im ARequestInfo.Username im IdHTTPServer1 zur Verfügung hätte?

Thx schonmal vorneweg
MfG

  Mit Zitat antworten Zitat
Kamil

Registriert seit: 16. Aug 2002
178 Beiträge
 
#2

Re: IdHTTPServer-control hätte gerne zusätzliches Info

  Alt 28. Sep 2003, 18:45
Zitat:
Q: How can I pass PostData when I Navigate to a URL?

A: I call the below method with a URL destination, PostData in the format of 'animal=cat&color=brown' etc. and the TWebBrowser object that I want to load the URL inside of...

Code:
procedure TDBModule.Navigate(stURL, stPostData: String; var wbWebBrowser: TWebBrowser);
var
  vWebAddr, vPostData, vFlags, vFrame, vHeaders: OleVariant;
  iLoop: Integer;
begin
  {Are we posting data to this Url?}
  if Length(stPostData)> 0 then
  begin
    {Require this header information if there is stPostData.}
    vHeaders:= 'Content-Type: application/x-www-form-urlencoded'+ #10#13#0;
    {Set the variant type for the vPostData.}
    vPostData:= VarArrayCreate([0, Length(stPostData)], varByte);
    for iLoop := 0 to Length(stPostData)- 1 do   // Iterate
    begin
      vPostData[iLoop]:= Ord(stPostData[iLoop+ 1]);
    end;   // for
    {Final terminating Character.}
    vPostData[Length(stPostData)]:= 0;
    {Set the type of Variant, cast}
    TVarData(vPostData).vType:= varArray;
  end;
  {And the other stuff.}
  vWebAddr:= stURL;
  {Make the call Rex.}
  wbWebBrowser.Navigate2(vWebAddr, vFlags, vFrame, vPostData, vHeaders);
end; {End of Navigate procedure.}
This tip provided by Craig Foley based on techniques from Nathan Wilhelmi's Usenet posting to borland.public.delphi.internet on the 31/1/99

A: Here's another option:

Code:
procedure TForm1.SubmitPostForm;
var
  strPostData: string;
  Data: Pointer;
  URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
begin
  {
 
  <form method="post" action="http://127.0.0.1/cgi-bin/register.pl">
  <input type="text" name="FIRSTNAME" value="Hans">
  <input type="text" name="LASTNAME" value="Gulo">
  <input type="text" name="NOTE" value="thats it">
  <input type="submit">
  </form>
  }
  strPostData := 'FIRSTNAME=Hans&LASTNAME=Gulo&NOTE=thats+it';
  PostData := VarArrayCreate([0, Length(strPostData) - 1], varByte);
  Data := VarArrayLock(PostData);
  try
    Move(strPostData[1], Data^, Length(strPostData));
  finally
    VarArrayUnlock(PostData);
  end;
  URL := 'http://127.0.0.1/cgi-bin/register.pl';
  Flags := EmptyParam;
  TargetFrameName := EmptyParam;
  Headers := EmptyParam; // TWebBrowser will see that we are providing
                         // post data and then should automatically fill
                         // this Headers with appropriate value
  WebBrowser1.Navigate2(URL, Flags, TargetFrameName, PostData, Headers);
end;
This tip provided by Hans Gulo.
  Mit Zitat antworten Zitat
ArrayOf..

Registriert seit: 7. Sep 2003
50 Beiträge
 
Delphi 7 Personal
 
#3

Re: IdHTTPServer-control hätte gerne zusätzliches Info

  Alt 28. Sep 2003, 22:35
Hallo,

habe die beiden Beispiele mal kurz ausprobiert.

Das erste sieht eigentlich ganz vielversprechend aus, weil ja hier immerhin ein 'Content-Type' in die Header-Var geladen werden soll - und das natürlich nachher im ARequestInfo bzw. im AResponseInfo des IdHTTPServer-Controls eventuell dann auftauchen könnte. Leider gab's dann aber in der Zeile << TVarData(vPostData).vType:= varArray; >> eine Exception der Klasse EVariantBadVarTypeError ??

Beim zweiten lief's dann zwar ohne Exception, allerdings gab es in diesen ARequestInfo- bzw. AResponseInfo-Daten des IdHTTPServer-Controls trotzdem keinen sichtbaren Effekt.

Trotzdem aber, thanks a lot *g*,

werde mir das Ganze wohl nachher trotzdem nochmal ein bisschen genauer angucken. Ein guter bzw. richtiger Ansatz ist das nämlich wahrscheinlich schon, zumindest die Richtung wird wohl auf alle Fälle stimmen.
MfG

  Mit Zitat antworten Zitat
Kamil

Registriert seit: 16. Aug 2002
178 Beiträge
 
#4

Re: IdHTTPServer-control hätte gerne zusätzliches Info

  Alt 29. Sep 2003, 00:21
Ah, jetzt ist mir eingefallen wie ich es gemacht habe:

Delphi-Quellcode:
function StringToPostData( Str:String):OleVariant;
var
  i,l:Integer;
  PostDataArray:Variant;
begin
  l:=Length( Str);
  PostDataArray:=VarArrayCreate([0,l-1],varByte);
  for i:=0 to l-1 do
    PostDataArray[i]:=Byte( Str[i+1]);
  Result:=PostDataArray;
end;

...
var
  URL,Flags,TargetFrameName,PostData, Header: OleVariant;
begin
  ...
  PostData:=StringToPostData(...);
  Header:='Content-Type: application/x-www-form-urlencoded'#13#10;
  IE.Navigate(URL,Flags,TargetFrameName,PostData, Header);
Es hat immer problemlos funktioniert.
  Mit Zitat antworten Zitat
ArrayOf..

Registriert seit: 7. Sep 2003
50 Beiträge
 
Delphi 7 Personal
 
#5

Re: IdHTTPServer-control hätte gerne zusätzliches Info

  Alt 29. Sep 2003, 10:13
hm..., eventuell läuft es ja, aber wo sollen diese Daten denn ankommen?

Im IdHTTPServer control komme ich ja pro Request (des TWebBrowsers) nur in 4 Eventhandlern vorbei, nämlich in: OnConnect, OnCreatePostStream, OnCommandGet u. OnDisconnect. In OnConnect u. OnDisconnect gibt es überhaupt keine dementsprechenden Daten abzugreifen. Im OnCreatePostStream existiert 'VPostStream', welcher bei mir aber immer NIL bleibz (da er als 'var' ausgezeichnet ist sieht er auch mehr so aus, als würde er eher zum Abschicken von Daten benutzt werden). Und schließlich der OnCommandGet-eventhandler. In ihm existieren nur die ARequestInfo- u. die AResponseInfo-Daten mit ihren u.a. vielen Feldstrings, die jedoch diese vorher in 'PostData' o. 'Headers' abgeschickten Stringinhalte nicht beinhalten (habe ich alle mal gecheckt ). Und 'ARequestInfo.PostStream' ist leider auch immer NIL.

Entweder diese Zeilen (um 'PostData' und 'Headers' zu beladen) funktionieren nicht bei mir oder wo sollten diese Daten denn nachher in den Eventhandlern des IdHTTPServer-controls abgreifbar sein? Oder wie müssten die eventuell vorher speziell formuliert sein, um dass sie vielleicht doch da irgendwo in diesen ARequestInfo-Daten herauskommen? Ich bin leider noch ein ziemlicher Anfänger in diesen Dingens, daher auch mein schreckliches Unwissen...

Danke jedenfalls für irgendwelche weiteren Inspirationen.
MfG

  Mit Zitat antworten Zitat
Kamil

Registriert seit: 16. Aug 2002
178 Beiträge
 
#6

Re: IdHTTPServer-control hätte gerne zusätzliches Info

  Alt 29. Sep 2003, 16:44
Hast du schon mal in die Indy Hilfe geschaut? Da ist doch alles beschrieben! Im OnCreatePostStream muss man, wie der Name schon sagt, einen Stream erstellen in den die Daten reinkommen.

Delphi-Quellcode:
function StringToPostData( Str:String):OleVariant;
var
  i,l:Integer;
  PostDataArray:Variant;
begin
  l:=Length( Str);
  PostDataArray:=VarArrayCreate([0,l-1],varByte);
  for i:=0 to l-1 do
    PostDataArray[i]:=Byte( Str[i+1]);
  Result:=PostDataArray;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  URL: WideString;
  Flags,TargetFrameName,PostData, Header: OleVariant;
begin
  URL:='http://127.0.0.1:80';
  PostData:=StringToPostData('PostData blablabla...'#13#10'und noch was...');
  Header:='Content-Type: application/x-www-form-urlencoded'#13#10;
  WebBrowser1.Navigate(URL,Flags,TargetFrameName,PostData, Header);
end;

procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  memo1.lines.add((ARequestInfo.PostStream AS TStringStream).DataString);
end;

procedure TForm1.IdHTTPServer1CreatePostStream(ASender: TIdPeerThread;
  var VPostStream: TStream);
begin
  VPostStream:=TStringStream.Create('');
end;
  Mit Zitat antworten Zitat
ArrayOf..

Registriert seit: 7. Sep 2003
50 Beiträge
 
Delphi 7 Personal
 
#7

Re: IdHTTPServer-control hätte gerne zusätzliches Info

  Alt 29. Sep 2003, 19:41
...ich glaub's nicht, ich glaub's nicht, ich glaub's nicht....., dass die Indy-Leute das so umständlich gemacht habe, das ist doch echt irgendwie total verrückt. (Ich kann's ja jetzt eigentlich immer noch nicht so richtig fassen, (der Smilie der hier hingehört ist noch nicht gemacht)).

So eine Lösung ist für mich einfach auch schon vom Ansatz her irgendwie abwegig. Wenn der VPostStream (oder irgendein anderer) Daten beinhalten würde täte hätte dann wäre er doch auch zum Zeichen dessen bestimmt nicht NIL, sondern deswegen doch eben gerade nicht

'ne Indy-Hilfe habe ich natürlich auch, und sogar auch schon mal reingeguckt, aber in einer anderen Sache *g*. Das hier war für mich jetzt irgendwie schon zu eindeutig (hoffnungslos) – nein (*scherz*), die Frage stellte ich ja eigentlich auch schon am 17.9. und zwar auf der Jagd nach einem bestimmten Error, den ich durch einen Umbau meines Programms dann bloß so nochmal zusätzlich etwas einkreisen wollte. Dieser Error hatte sich dann aber schließlich anders beseitigen lassen. Allerdings muss ich schon sagen – in essentiellen Situationen sehe ich zum Schluss dann doch schon quasi auch noch mal in der aller letzten Rille (sprich Indy-Hilfe) nach...

...alsooooo, da muss ich erst irgendwo ganz anders einen VPostStream createn, um dass ich dann in einem später besuchten eventhandler einen ARequestInfo.PostStream auslesen kann, der sonst die geschickten Daten einfach unterschlägt.... wahnsinn... Also wenn die den Rest der Funktionen auch so gut versteckt haben, dann: O weh, o weh. Das ist ja noch eine Millionen mal schlimmer als aller bestens versteckte Ostereier suchen...

Trotzdem natürlich, besten Dank nochmal.
(denn brauchbar/nützlich kann dieser Datentransfer ja auf alle Fälle irgendwann mal sein. Und das Wissen über eine derartige technische Abwicklung sowieso *g*)
MfG

  Mit Zitat antworten Zitat
Kamil

Registriert seit: 16. Aug 2002
178 Beiträge
 
#8

Re: IdHTTPServer-control hätte gerne zusätzliches Info

  Alt 29. Sep 2003, 22:45
Du kannst es auch ohne das OnCreatePostStream machen:
der code ist so wie vorher nur ohne eben dieses Ereignis und OnCommandGet sieht so aus:

Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  memo1.lines.add(ARequestInfo.FormParams);
end;
ARequestInfo.PostStream ist nil, da er in der Funktion TIdCustomHTTPServer.DoExecute kurz erstellt wird wenn du ihn nicht selber erstellt hast. Die Daten werden dann in ARequestInfo.FormParams kopiert (falls es sich um einen TStringStream handelt auch wenn du ihn erstellt hast) und der Stream sofort wieder freigegeben.
  Mit Zitat antworten Zitat
ArrayOf..

Registriert seit: 7. Sep 2003
50 Beiträge
 
Delphi 7 Personal
 
#9

Re: IdHTTPServer-control hätte gerne zusätzliches Info

  Alt 30. Sep 2003, 01:03
Aha, grundsätzlich nicht uninteressant. Wie ich aber leider gerade gemerkt habe, klappt das Ganze jedoch trotzdem nur in den Fällen, in denen ich das Beladen von 'PostData' bzw. 'Headers' noch vor dem eigentlich Methodenaufruf von WebBrowser1.Navigate(...) ausführe. Mache ich das im OnBeforeNavigate2-Eventhandler (wo ich das ja auch benötigte und die ganze Zeit über versucht hatte) geht es aber leider trotzdem nicht (auch nicht das über die Streams). Ich hatte deinen Code nämlich zwischenzeitlich auch zusätzlich nochmal vor diesen Methodenaufruf kopiert, daher dachte ich nachher versehentlich, es würde insgesamt funktionieren.

Bei dem URL-Parameter dieses Eventhandlers ist es übrigens bedauerlicherweise genauso. Den kann man zwar überladen, aber leider auch ohne Effekt. 'Cancel' funktioniert dagegen wieder. Ich glaubte auch auf irgendeiner gegoogelten Seite auch mal das Beladen der PostData-Variablen im Eventhandler gesehen zu haben, bin mir da jetzt nachträglich aber nicht mehr so 100% sicher ob es wirklich auch im Eventhandler gewesen ist.

Na ja, bleibt da wohl nur auf einen der nächsten Service Packs (etwa 5 bis 500 *g*) zu hoffen.
MfG

  Mit Zitat antworten Zitat
Antwort Antwort


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 09:24 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