Delphi-PRAXiS
Seite 2 von 3     12 3      

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 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


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Seite 2 von 3     12 3      

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