4.4 POST形式でリクエストを送信する
POST形式でのデータ送信は、「4.1 HTTPサーバへリクエストを送信する」で使用したAPIを使って行います。HTTPサーバのステータスコードを取得する方法などもGET形式の場合と同じです。

GET形式では、送信するデータをURL内に含めるため送信できるデータの量に限界がありますが、POST形式を使うとそういった制約を気にすることなく大きなデータも送信できるというメリットがあります。

参考までに、この技はAccess VBA以外に、Excelマクロなど他のVBAでも使用することができます。
POST形式でデータを送信する場合の決まりごと
HTTPサーバへPOST形式でデータを送信する場合、HTTPヘッダーというHTTPサーバへの要求内容を記す情報へ「これはPOSTデータです」という情報を加えなくてはなりません。この情報はHttpSendRequestの第2引数に指定します。

Private Declare Function HttpSendRequest _
            Lib "wininet.dll" _
          Alias "HttpSendRequestA" _
         (ByVal hRequest As Long _
        , ByVal lpszHeaders As String _
        , ByVal dwHeadersLength As Long _
        , ByVal lpOptional As String _
        , ByVal dwOptionalLength As Long) As Integer

指定する内容は次の通りです。併せてヘッダー情報の長さ(文字数)をdwHeadersLengthへ指定します。この場合は47(文字)です。

Content-Type: application/x-www-form-urlencoded

さらに、送信するデータとその長さもHttpSendRequestへ指定します。指定する場所は、データが第4引数「lpOptional」、長さが第5引数「dwOptionalLength」です。データは、GET形式の場合と同じように各パートを&記号で挟んだ書式で記述します。

●書式
 キー名=データ
 [1]上記で1セット。複数セットを送信するときは&記号で繋ぐ。
 [2]日本語や一部の記号などは%xx形式にエンコードする必要がある。

●例
 data1=abc&data2=def&data3=123

ただし、日本語や一部の記号などを使う場合は%xx形式へのエンコードが必要です。4.7 送信データのエンコードを参考にしてください。
POST形式でデータを送信する例
POST形式でデータを送信する例です。サンプルの内容は「4.2 HTTPサーバからの応答を取得する」とほぼ同じですが、このサンプルではPOST形式でデータを送信しています。

POST形式でデータを送信するときは、HTTPOpenRequestの第2引数へPOSTを指定しリクエストを開きます。ただし、サンプルではプロシージャ「fcHTTPOpenRequest」内で呼び出しているため、このプロシージャを呼び出すときの引数を「POST」にしています。

また、リクエストの送信は、プロシージャ「fcHTTPSendRequest」で行っています。送信データとPOST時のヘッダーは、HttpSendRequestの各引数へ指定しています。

'変数の定義 ※(General)(Declarations)です
Private lngWinINet As Long 'インターネットハンドルの保存用
Private lngHttpHnd As Long 'HTTPハンドルの保存用
Private lngReqHnd  As Long 'HTTPリクエストハンドルの保存用
Private strBuffer  As String * 1024 'サーバからの応答保存用
Private lngLength  As Long '応答結果のデータ長


Sub prcHTTPQueryInfoSample()

    Dim lngRC As Long

    'インターネットサービスをオープンします
    lngRC = fcInternetOpen

    'オープンに成功したらHTTPサーバとの接続と切断を行います
    If lngRC = 0 Then

       'HTTPサーバへ接続します
       lngRC = fcHTTPConnect("www.uso-web-server.net")

       '接続に成功したらリクエストを初期化します
       If lngRC = 0 Then
          lngRC = fcHTTPOpenRequest("POST", "/cgi/test/post.cgi")
       End If

       'リクエストの初期化に成功したら、リクエストを送信します
       If lngRC = 0 Then
          lngRC = fcHTTPSendRequest
       End If

       'サーバからの応答を取得します(サーバ情報を取得する例)
       If lngRC = 0 Then
          lngRC = fcHTTPQueryInfo(HTTP_QUERY_SERVER)
          MsgBox Left(strBuffer, lngLength)
       End If

       'HTTPリクエストをクローズします
       Call fcHttpRequestClose

       'HTTPサーバから切断します
       Call fcHTTPDisConnect

    End If

    'インターネットサービスをクローズします
    Call fcInternetClose

End Sub


Function fcHTTPQueryInfo(lngInfoLevel As Long) As Long

    Dim tmpIndex As Long

    lngLength = 1024 '初期値はstrBufferの長さ
    strBuffer = vbNullString '受け取り領域は必ず初期化すること
    tmpIndex = 0

    'APIの実行/サーバからの応答を取得
    Call HttpQueryInfo(lngReqHnd _
                     , lngInfoLevel _
                     , ByVal strBuffer _
                     , lngLength _
                     , tmpIndex)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcHTTPQueryInfo = Err.LastDllError

End Function


Function fcHTTPOpenRequest(strMethod As String, strURL As String) As Long

    Dim tmpURL    As String * 255

    'URLは255バイトの固定長文字列で渡す
    tmpURL = strURL

    'APIの実行/リクエストを初期化
    lngReqHnd = HttpOpenRequest(lngHttpHnd _
                              , strMethod _
                              , tmpURL _
                              , "HTTP/1.1" _
                              , vbNullString _
                              , 0 _
                              , INTERNET_FLAG_RELOAD _
                              , 0)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcHTTPOpenRequest = Err.LastDllError

End Function


Function fcHTTPSendRequest() As Long

    Dim strHeader   As String
    Dim strPostData As String

    'ヘッダー情報
    strHeader = "Content-Type: application/x-www-form-urlencoded"
    '送信データ
    strPostData = "text1=abc&text2=def&text3=123"

    'APIの実行/リクエストを送信
    Call HttpSendRequest(lngReqHnd _
                       , strHeader _
                       , Len(strHeader) _
                       , strPostData _
                       , Len(strPostData))

    'この関数の戻り値には、APIの処理結果コードを返します
    fcHTTPSendRequest = Err.LastDllError

End Function


Function fcHttpRequestClose() As Long

    'APIの実行/インターネットサービスをクローズ
    Call InternetCloseHandle(lngReqHnd)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcHttpRequestClose = Err.LastDllError

End Function


Function fcHTTPConnect(Server As String) As Long

    'APIの実行/HTTPサーバへ接続
    lngHttpHnd = InternetConnect(lngWinINet _
                              , Server _
                              , INTERNET_DEFAULT_HTTP_PORT _
                              , vbNullString _
                              , vbNullString _
                              , INTERNET_SERVICE_HTTP _
                              , 0 _
                              , 0)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcHTTPConnect = Err.LastDllError

End Function


Function fcHTTPDisConnect() As Long

    'APIの実行/HTTPサーバから切断
    Call InternetCloseHandle(lngHttpHnd)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcHTTPDisConnect = Err.LastDllError

End Function


Function fcInternetOpen() As Long

    'APIの実行/インターネットサービスをオープン
    lngWinINet = InternetOpen(vbNullString _
                            , INTERNET_OPEN_TYPE_PRECONFIG _
                            , vbNullString _
                            , vbNullString _
                            , 0)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcInternetOpen = Err.LastDllError

End Function


Function fcInternetClose() As Long

    'APIの実行/インターネットサービスをクローズ
    Call InternetCloseHandle(lngWinINet)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcInternetClose = Err.LastDllError

End Function
 ※この他に、API関数を定義する必要があります。
 ※www.uso-web-server.netは架空のドメイン名です。
Copyright(C) 1999-2006 結城圭介。 All rights reserved