お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"[Wininet]POST及びStatusCodeの確認"



 usesにWininetを加えてください。Wininet.dllはInternet Explorerで使われ
ているDLLです。

function GetFileFromInternet(AUrl, APostStr:string;
  AStream:TMemoryStream): integer;
var
  hSession, hConnect, hRequest: hInternet;
  RequestMethod, Header: string;
  Buf:array[0..1023] of Char;
  ReadCount:Cardinal;
  UrlInfo: TUrlInfo;

  procedure SetTimeOut; //TimeOutの設定
  var
    TimeOut: integer;
  begin
    TimeOut := 60 * 1000; //単位はmsなんで秒に変換(60秒に設定)
    InternetSetOption(hSession, INTERNET_OPTION_RECEIVE_TIMEOUT, @TimeOut,
      SizeOf(TimeOut));
  end;
  procedure GetHttpStatus; //StatusCodeの取得
  var
    Len, Reserved: DWORD;
  begin
    Reserved := 0;
    Len := SizeOf(Result);
    HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER,
      @Result, Len, Reserved) then
  end;
begin
  Result := 0;
  if not GetUrlInfo(AUrl, UrlInfo) then Exit;
  hSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    SetTimeOut;
    hConnect := InternetConnect(hSession, PChar(UrlInfo.HostName),
      INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
    try
      if APostStr = '' then
        RequestMethod := 'GET'
      else
        RequestMethod := 'POST';
      hRequest := HttpOpenRequest(hConnect, PChar(RequestMethod),
                    PChar(UrlInfo.UrlPath), 'HTTP/1.0', nil, nil,
                    INTERNET_FLAG_RELOAD, 0);
      try
        if APostStr = '' then
          Header := ''
        else
          Header := 'Content-type: application/x-www-form-urlencoded';
        HttpSendRequest(hRequest, PChar(Header), 
          Length(Header), PChar(APostStr), Length(APostStr));
        GetHttpStatus;
        if Result <> HTTP_STATUS_OK then Exit;
        while True do //ストリームに書き込み
        begin
          if not InternetReadFile(hRequest, @Buf, SizeOf(Buf), ReadCount) then
            Break;
          if ReadCount = 0 then
            Break
          else
            AStream.Write(Buf, ReadCount);
        end;
      finally
        InternetCloseHandle(hRequest);
      end;
    finally
      InternetCloseHandle(hConnect);
    end;
  finally
    InternetCloseHandle(hSession);
  end;
end;

■使い方■
 FormにMemoとButtonを1つ置いて下さい。
 また上のInternetCrackUrlのサンプルにある、GetUrlInfoという関数を使って
います。

procedure TForm1.Button6Click(Sender: TObject);
var
  M: TMemoryStream;
begin
  ListBox1.Items.Clear;
//  if InternetAttemptConnect(0) = ERROR_SUCCESS then
  begin
    M := TMemoryStream.Create;
    try
//Postの場合は、下の「POST」の部分に送信したい文字を入れてください。
//  GetFileFromInternet(URL, POST, TStream)
//Getの場合は、POSTの欄は空白。返り値で HTTP_STATUS_OK 以外は失敗で、
//0か指定されたURLのStatusCodeが入っています。
      if GetFileFromInternet('http://www.inprise.co.jp/index.html', '', M) 
        = HTTP_STATUS_OK then
      begin
        M.Position := 0;
        Memo1.Lines.LoadFromStream(M);
      end else
        Memo1.Lines.Text := '失敗';
    finally
      M.Free;
    end;
  end;
end;
                                      00/06/09 (Fri) ぶんぶん鈴木

Original document by ぶんぶん鈴木    氏 ID:(EZA00106)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum