|

|
|
 |
4.4 POST形式でリクエストを送信する |
 |
|
|
|
|
|
POST形式でのデータ送信は、「4.1 HTTPサーバへリクエストを送信する」で使用したAPIを使って行います。HTTPサーバのステータスコードを取得する方法などもGET形式の場合と同じです。
GET形式では、送信するデータをURL内に含めるため送信できるデータの量に限界がありますが、POST形式を使うとそういった制約を気にすることなく大きなデータも送信できるというメリットがあります。
参考までに、この技はAccess VBA以外に、Excelマクロなど他のVBAでも使用することができます。
|
|
|
|
|
|
|
|
|
|
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形式でデータを送信する例です。サンプルの内容は「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は架空のドメイン名です。
|
|
|
|
|