Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Web Server Anwendungen (https://www.delphipraxis.net/364-web-server-anwendungen.html)

Tpercon 7. Jul 2002 12:47


Web Server Anwendungen
 
Kennt jemand 'nen gutes Tutorial oder Buch über das Erstellen von Web Server Anwendungen?

sakura 7. Jul 2002 15:09

Nein, aber was genau willst Du erreichen, vielleicht kann ich Dir ja helfen, ich machen den lieben langen Arbeitstag nichts anderes.

Tpercon 7. Jul 2002 17:07

Mich würde mal interessieren wie z.B. die Forensoftware von ArneE aufgebaut ist oder wie man prinzipiell sowas macht.

sakura 7. Jul 2002 17:10

Welche Delphi Version steht Dir zur Verfügung - davon hängt ab, wieviel von Hand gemacht werden muss, bzw. welche Funktionen von Delphi genutzt werden können.
:cat:

Tpercon 7. Jul 2002 17:20

5 Enterprise

Chewie 7. Jul 2002 19:02

Zitat:

Zitat von Tpercon
Mich würde mal interessieren wie z.B. die Forensoftware von ArneE aufgebaut ist oder wie man prinzipiell sowas macht.

Also eine auf HTML basierende Forensoftware wie diese ist nicht besonders schwer, nur aufwändig. Es geht in Delphi genauso wie z. B. in PHP - man muss die EXE eben nur als CGI-Modul zum Laufen bringen.
Der Schlüssel bei HTML-basierten Systemen sind die Daten die bei einem HHTP-Request übergeben werden. Z.b. übermittelt forum.html?post=131 der Datei forum.html ein Parameter namens post mit dem Wert 131. Diese Information kann diese Datei, z. B. ein CGI-,PHP-Script oder eine in Delphi geschriebene CGI-Anwendung, dann auswerten und z. B. den Beitrag Nummer 131 anzeigen.

Das Prinzip hier ist also: Du speicherst die Beiträge der Benutzer in einer DB. Diesen Beiträgen weist du Nummern zu, und um die Beiträge anzusehen, muss derjenige, der dies tun will, dir übermitteln, welchen Beitrag er ansehen will. Bis hierher ist es egal, ob du das HTTP-Protokoll benutzt oder ein eigenes. Nur bei der Art der Übermittlung gibt es viele Möglichkeiten: Bei der HTTP-Methode hast du die Möglichkeiten des POST- und des (obengenannten) GET-Request, wenn du selber Client- und Serverprotokolle schreibst, kannst du natürlich den Befehl beliebig nennen und die Art der Befehlsübermittlung frei bestimmen.

Tpercon 7. Jul 2002 19:14

Das ist eigentlich alles einigermaßen klar, kenne ich von PHP. Nur was ich halt nicht verstehe ist, wie eine Anwendung HTML Befehle an den Browser sendet oder was auch immer da passiert:?:

Chewie 7. Jul 2002 19:27

Zitat:

Zitat von Tpercon
Nur was ich halt nicht verstehe ist, wie eine Anwendung HTML Befehle an den Browser sendet oder was auch immer da passiert:?:

Das Schlüsselwort heißt CGI. Ich weiß aber nicht, wie man selber eine CGI-Anwendung aus einer Delphi-Anwendung macht. Ich hab das auch mal gemacht, mit einer Kompo, die hieß CGI-Expert, herunzerzuladen unter http://www.cgiexpert.com. Ist leider kostenpflichtig, es gibt aber eine abgespeckte Freeware-Version, die für einfache CGI-Anwendungen inkl. GET, POST und Cookies ausreicht. Wenn du aber selber die CG-Schnitstelle programmieren willst, kann ich dir auch nicht weiterhelfen. Ich würd dir aber empfehlen, wenn du schon Delphi nehmen willst, dann kannst du auch die Einschränkungen des HTTP-Protokolls hinter dir lassen und gleich ein eigenes Client-Server-Protokoll entwerfen. Das Problem hierbei wäre halt nur die Plattformkompatibilität :( .

Tpercon 7. Jul 2002 20:20

Kennst du ne URL wo man mehr Infos über CGI bekommt?

Mr_T 7. Jul 2002 21:11

Wenn ich mich nicht ganz täusche, dann sind cgis in delphi an sich reine konsolenapplikationen, die dann als "ausgabe" html - code ausspucken ... (zumindest bei win-servern kann ich mir dqas so vorstellen ...) dieses müsste dann in eine datei umgeleitet werden und der webserver liefert dem clienten dann diese ausgabedatei ...
irgendwie so war das mal ... (ist etwas her, dass ich mich damit befasst habe.....)

Tpercon 8. Jul 2002 19:26

Das scheint ja alles wirklich viel umständlicher zu sein, als dies mit php zu machen.

jbg 8. Jul 2002 19:44

Hier mal ein Beispiel für eine CGI Anwendung:
Code:
program MyCgi;
uses Windows, SysUtils;
{$APPTYPE CONSOLE}

var QueryString: string;
begin
  QueryString := GetEnvironmentVariable('Query_String');
   { Argumente mit ? übergeben: 'MyCgi.exe?Param1=Irgendwas&Post=443' }

  WriteLn('Content-type: text/html');WriteLn; // http-Header schicken
 
  WriteLn('<html><body bgcolor=white>');
  WriteLn('

' + QueryString + </p>');
  WriteLn('</body></html>');
end.
Und so schwer ist das nun auch wieder nicht.

Tpercon 8. Jul 2002 19:53

Schwer sieht das nicht aus. Ist denn so der generelle Aufbau oder hast du da jetzt Sachen weggelassen?
Kennst du ne gute Seite wo man sowas lernen kann?

sakura 8. Jul 2002 19:59

Ich werde mich jetzt mal dran machen und ein kleines Projekt mit Hilfe von D5 Enterprise erstellen. Also, ein wenig noch...

Tpercon 8. Jul 2002 20:00

Du bist der Beste! Laß dir nur Zeit, eilt nicht. :D

jbg 8. Jul 2002 21:07

Zitat:

Zitat von Tpercon
Ist denn so der generelle Aufbau oder hast du da jetzt Sachen weggelassen?

Ja, das ist der generelle Aufbau wenn du nicht über die bei der Pro und Ent. Version enhaltenen TCGIApplication Klasse programmierst.
Ich habe aber etwas meiner Meinung nach wichtiges weggelassen. Nämlich die Umwandlungsroutine für den Query_String.
Code:
function HexToChar(const S: string): Char;
  function HexCharToByte(c: Char): Byte;
  begin
    if c in ['0'..'9'] then Result := Ord(c) - Ord('0')
     else if c in ['a'..'f'] then Result := 10 + ord(c) - ord('a')
     else if c in ['A'..'F'] then Result := 10 + ord(c) - ord('A')
     else Result := 0;
  end;
begin
  if Length(S) = 2 then
    Result := Char((HexCharToByte(S[1]) shl 4) or (HexCharToByte(S[2])))
  else
    Result := #32;
end;

procedure QueryStringToList(const QueryString: string; List: TStrings);
var
  S: string;
  i: Integer;
  F, P: PChar;
begin
  if QueryString = '' then Exit;
  F := PChar(QueryString);
  P := F;
  while True do
  begin
    if P^ in [#0, '&'] then
    begin
      SetString(S, F, P - F);
      F := P + 1;
      i := 1;
      while i < Length(S) do
      begin
        if S[i] = '%' then
        begin
          S[i] := HexToChar(Copy(S, i + 1, 2));
          Delete(S, i + 1, 2);
        end;
        Inc(i);
      end;
      List.Add(S);
    end;
    if P^ = #0 then Break;
    Inc(P);
  end;
end;
Zitat:

Kennst du ne gute Seite wo man sowas lernen kann?
Ne leider nicht. Ich hab mir das auch nur aus mehreren Quellen zusammengetragen. (QueryStringToList und HexToChar habe ich natürlich selbst geschrieben).
Die Daten in der Environment Variable Query_String sind die GET Daten. Die POST Daten werden kann man über ReadLn einlesen. Die Länge der POST Daten wird durch die Environment Variable "Content_Length" und der Typ der Daten mit "Content_Type" an das CGI Programm übergeben.

Chewie 8. Jul 2002 21:21

Das Thema interessiert mich auch. Wie kann man Cookie-Daten einlesen?

jbg 8. Jul 2002 21:46

Zitat:

Zitat von jbg
Code:
function GetCookie(Name: string): string;
var
  Cookie: string;
  ps: Integer;
begin
  Result := '';
  Cookie := GetEnvironmentVaiable('HTTP_COOKIE');
  ps := Pos(Name + '=', Cookie);
  if ps > 0 then
  begin
    Delete(Cookie, 1, ps + Length(Name) - 1);
    ps := pos(';', Cookie);
    if ps = 0 then ps := Pos(' ', Cookie);
    if ps = 0 then ps := Length(Cookie) + 1;
    Result := Copy(Cookie, 1, ps - 1);
  end;
end;
Und setzen kann man Cookies, in dem man folgende Prozedur für jedes zu setzendes Name=Value Paar im http-Header aufruft.
Code:
procedure SetCookie(const Name, Value: string);
begin
  WriteLn('Set-Cookie: ', Name, '=' , Value);
end;

...
// Header senden:
WriteLn('Content-type: text/html');
SetCookie('MyC1', 'Something');
SetCookie('MyC2', 'Some other things');
WriteLn; // header abschließen
Und wenn wir gerade dabei sind. So bekommt man heraus, ob die GET oder POST Methode benutzt wird.
Code:
uses Windows, ...;
var
  s: string;
  ContentLength: Integer;

if SameText(GetEnvironmentVariable('REQUEST_METHOD'), 'POST') then begin
begin
  // per POST übertragen -> POST Daten einlesen
  ContentLength := IntToStrDef(GetEnvironmentVariable('Content_Length'), 0);
  SetLength(s, ContentLength);
  if ContentLength > 0 then
    ReadFile(STD_INPUT_HANDLE, s[1], ContentLength, readn, nil);
end;


Chewie 8. Jul 2002 21:56

Zu dem GetEnvironmentVariable:
In welcher Unit steht das? Wenn ich das aus der windows.pas benutze, krieg ich ne Fehlermeldung, weil die Parameter falsch sind (ist ja im PDSK klar ersichtlich). Hast du da in deinen Posts einen Fehler gemacht oder beziehst du diese Funktion aus einer anderen Unit?

sakura 8. Jul 2002 21:59

Nicht der Beste, aber ich habs in die FAQs gestellt.

http://www.delphipraxis.de/viewtopic.php?p=3215#3215

jbg 8. Jul 2002 22:02

Ich habe noch ein paar Fehler im Post ausgebessert.

Zu GetEnvironmentVariable:
Ab Delphi 6 ist diese Funktion in SysUtils.
Hier hast du eine Version, die auch unter D345 läuft:
Code:
function GetEnvVar(const Name: string): string;
var P: PChar;
begin
  P := StrAlloc(10000);
  try
    GetEnvironmentVariable(PChar(Name), P, 10000);
    Result := P;
  finally
    StrDispose(P);
  end;
end;

@sakura: Meine CGI Variante ist eher für die NonVCL Leute. :)
Ich nutze natürlich auch die WinCGI-Variante von dir, wenn ich mal ein CGI-Programm schreiben muss (was selten vorkam/kommt).

Chewie 8. Jul 2002 22:14

Danke, jbg, für die Funktion. Ich selbst benutze noch D5. Ich war gerade dabei, die Funkion der WinAPI mit den ganzen Pointern zu schreiben, aber das erübrigt sich jetzt :D .
Ich finde im Übrigen deine Variante besser als Sakuras. 1. ist sie kleiner (was bei CGI-Anwendungen allerdings nahezue egal ist, also ist das kein Pluspunkt :shock: ), 2. schreibt man alles selbst und kann so das Programm selbst strukturieren unnd 3. ist es sowieso egal, da ich nicht vorhabe in absehbarer Zeit, CGIs in Delphi zu entwickeln. Aber interessant war diese Einführung allemal. Danke.

Alfons_G 9. Jul 2002 08:36

:hi:
Ein brauchbares Tutorial, allerdings in englisch, gibt es hier:
Web Programming in Delphi
Hier findet man die Erstellung von Datenbankanwendungen usw. und auch einige Tools zum Download. Das Ganze ist ein Online-Buch, welches zum Teil fertig ist (und nach Fertigstellung wahrscheinlich nicht mehr umsonst zu haben sein wird).

:coder:

sakura 9. Jul 2002 08:52

Zitat:

Zitat von Chewie
Ich finde im Übrigen deine Variante besser als Sakuras.

:twisted: :evil: Argh, zum Teufel mit Dir. :lol:

Ich finde Borlands Weg auch nicht so geglückt, aber ich glaube, das Arne sein Forum auf diese Art und Weise gebastelt hat. Und auch Borlands Weg hat seine Vorteile, da Borland bereits viel Arbeit übernommen hat. Und wenn man beruflich Web Anwendungen schreibt, dann schreibt man in den seltensten Fällen "from scratch", sondern nutzt so viele Vorgaben wie möglich.
Allerdings schreibe auch ich meine ISAPI Anwendungen, sowohl Filter als auch Extensions, lieber komplett von Hand.

Kurz: Immerhin habe ich Borlands Weg gezeigt.

Ich bin noch dabei, sämtliche ISAPI Headers zu übersetzen und werde diese nach Fertigstellung auch über die JEDI-Bibliothek zur Verfügung stellen. :)

thebaer 31. Okt 2002 20:48

JEDI-Bibliothek ?!? :?: :!: :?:

Vielleicht steh ich ja nur auf dem Schlauch aber
was ist das genau, wo gibts das ?!?

sakura 31. Okt 2002 21:00

Die Delphi-JEDI ist eine Open-Source Gemeinde, welche es sich zum Ziel gesetzt hat, möglichst viele Windows API Schnittstellen von C/C++ nach OOPascal/Delphi zu portieren.

http://www.delphi-jedi.org

thebaer 31. Okt 2002 21:25

Danke, schau ich mir gleich mal an! :shock:


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