HTTPサーバーからページ情報を取得          <TOP>


InternetOpen インターネットのハンドルを作成

InternetConnect インターネット上のサーバーに接続し、ハンドルを返す

HttpOpenRequest HTTPリクエストの作成

HttpSendRequest 指定されたHTTPリクエストをサーバーへ送信

HttpQueryInfo HTTPリクエストに関する情報を取得

InternetCloseHandle Win32インターネット関数のハンドルをクローズ

InternetQueryOption 指定されたハンドルに対するインターネットオプション情報を取得

 

 

'================================================================
'= HTTPサーバーからページ情報を取得
'=    (HttpOpenRequest.bas)
'================================================================
#include "Windows.bi"

' インターネットのハンドルの作成
Declare Function Api_InternetOpen& Lib "wininet" Alias "InternetOpenA" (ByVal sAgent$, ByVal lAccessType&, ByVal sProxyName$, ByVal sProxyBypass$, ByVal lFlags&)

' インターネット上のサーバに接続し、ハンドルを返す
Declare Function Api_InternetConnect& Lib "wininet" Alias "InternetConnectA" (ByVal hSession&, ByVal sServerName$, ByVal nServerPort&, ByVal sUsername$, ByVal sPassword$, ByVal lService&, ByVal lFlags&, ByVal lContext&)

' HTTPリクエストの作成
Declare Function Api_HttpOpenRequest& Lib "wininet" Alias "HttpOpenRequestA" (ByVal hHttpSession&, ByVal sVerb$, ByVal sObjectName$, ByVal sVersion$, ByVal sReferer$, ByVal something&, ByVal lFlags&, ByVal lContext&)

' 指定されたHTTPリクエストをサーバへ送信
Declare Function Api_HttpSendRequest& Lib "wininet" Alias "HttpSendRequestA" (ByVal HttpRequest&, ByVal sHeaders$, ByVal lHeadersLength&, sOptional As Any, ByVal lOptionalLength&)

' HTTPリクエストに関連する情報の取得
Declare Function Api_HttpQueryInfo& Lib "wininet" Alias "HttpQueryInfoA" (ByVal HttpRequest&, ByVal lInfoLevel&, ByRef Buffer As Any, ByRef BufferLen&, ByRef lIndex&)

' Win32インターネット関数のハンドルのクローズ
Declare Function Api_InternetCloseHandle& Lib "wininet" Alias "InternetCloseHandle" (ByVal hInet&)

' 指定されたハンドルに対するインターネットのオプション情報を取得
Declare Function Api_InternetQueryOption& Lib "wininet" Alias "InternetQueryOptionA" (ByVal hInternet&, ByVal lOption&, ByRef Buffer As Any, ByRef BufferLen&)

#define INTERNET_OPEN_TYPE_PRECONFIG 0  'プロキシまたはレジストリから直接コンフィギュレーションを取得
#define INTERNET_DEFAULT_FTP_PORT 21    'RFCで既定されたftpポート
#define INTERNET_DEFAULT_HTTP_PORT 80   'RFCで既定されたhttpポート
#define INTERNET_DEFAULT_HTTPS_PORT 443 'RFCで既定されたhttpsポート
#define INTERNET_SERVICE_HTTP 3         'HTTPサービス
#define INTERNET_FLAG_RELOAD -2147483648'ダウンロード時キャッシュを使わずサーバーから行う
#define HTTP_QUERY_STATUS_CODE 19       'サーバから返された状態コード
#define HTTP_QUERY_STATUS_TEXT 20       'サーバから返された補足のテキスト
#define HTTP_QUERY_RAW_HEADERS 21       'NUL文字で区切られた全てのヘッダ
#define HTTP_QUERY_RAW_HEADERS_CRLF 22  'CR/LFで区切られた全てのヘッダ
#define HTTP_QUERY_FLAG_REQUEST_HEADERS -2147483648 '応答ヘッダの取得
#define UserAgent "http sample"

Var Shared hSession As Long
Var Shared hConnect As Long
Var Shared hHttpOpenRequest As Long

Var Shared Edit1 As Object
Var Shared Edit2 As Object
Var Shared Button1 As Object

Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Edit2.Attach GetDlgItem("Edit2") : Edit2.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Function GetQueryInfo(ByVal HttpRequest As Long, ByVal InfoLevel As Long) As String
Function GetQueryInfo(ByVal HttpRequest As Long, ByVal InfoLevel As Long) As String
    Var Buffer As String * 1024
    Var BufferLen As Long
    Var Ret As Long

    BufferLen = Len(Buffer)
    Ret = Api_HttpQueryInfo(HttpRequest, InfoLevel, Buffer, BufferLen, 0)
    GetQueryInfo = Left$(Buffer, BufferLen)
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var Host As String
    Var StatusCode As String
    Var StatusText As String
    Var RawHeaders As String
    Var RawHeadersCrLf As String
    Var Server As String
    Var Ret As Long

    Edit2.SetWindowText ""

    Host = Left$(Edit1.GetWindowText, InStr(Edit1.GetWindowText, "/") - 1)

    'インターネットに接続       http sample   レジストリの設定に従う
    hSession = Api_InternetOpen(UserAgent, INTERNET_OPEN_TYPE_PRECONFIG, ByVal 0, ByVal 0, 0)

    If CLng(hSession) Then
        'HTTPサーバーに接続
        hConnect = Api_InternetConnect(hSession, Host, INTERNET_DEFAULT_HTTP_PORT, ByVal 0, ByVal 0, INTERNET_SERVICE_HTTP, 0, 0)

        If hConnect > 0 Then
            'サーバー上で欲しいURLを指定
            hHttpOpenRequest = Api_HttpOpenRequest(hConnect, "HEAD", Right$(Edit1.GetWindowText, Len(Edit1.GetWindowText) - InStr(Edit1.GetWindowText, "/") + 1), "HTTP/1.1", ByVal 0, 0, INTERNET_FLAG_RELOAD, 0)

            If Clng(hHttpOpenRequest) Then
                'ヘッダーを要求
                Ret = Api_HttpSendRequest(hHttpOpenRequest, ByVal 0, 0, 0, 0)

                If Ret Then        'ファイルの内容を受信
                    'サーバから返された状態コード
                    StatusCode = GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_STATUS_CODE)
                    'サーバから返された補足のテキスト
                    StatusText = GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_STATUS_TEXT)
                    'NUL文字で区切られた全てのヘッダ
                    RawHeaders = GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_RAW_HEADERS)

                    'CR/LFで区切られた全てのヘッダ
                    RawHeadersCrLf = GetQueryInfo(hHttpOpenRequest, HTTP_QUERY_RAW_HEADERS_CRLF)
                    Edit2.SetWindowText RawHeadersCrLf
                End If
            End If
        End If
    End If

    'すべてのハンドルをクローズ
    Ret = Api_InternetCloseHandle(hHttpOpenRequest)
    Ret = Api_InternetCloseHandle(hSession)
    Ret = Api_InternetCloseHandle(hConnect)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End