VB.net : COMの Msxml2.ServerXMLHTTP を使用して http 通信を行う で GET による通信処理
が可能になったので、POST 処理を実装しています。テストとしては同梱している php のコードを
使って localhost で行っていますが、一般の POST を行う WEB アプリに対しても利用できます
Imports System.Web
Imports myCom
Module Module1
Sub Main()
' http 通信用のオブジェクトを作成
Dim ServerXML As New myCom.ServerXMLHTTP60()
' 呼び出す URL を設定
Dim URL As String = "http://localhost/api/url_rfc3986.php"
' POST する為に開く
ServerXML.open("POST", URL, False)
' POST する為の http ヘッダをセット
ServerXML.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
' タイムアウトの設定
Dim lResolve As Integer = 60 * 1000
Dim lConnect As Integer = 60 * 1000
Dim lSend As Integer = 60 * 1000
Dim lReceive As Integer = 60 * 1000
ServerXML.setTimeouts(lResolve, lConnect, lSend, lReceive)
' 変換元の文字列を引数から取得する
' 空白を指定したい場合は、"文字列 文字列" のように指定する
Dim arguments As String() = Environment.GetCommandLineArgs()
' 引数は一つのみ許可
if arguments.Length <> 2 then
Console.WriteLine("引数を指定して下さい")
Return
end if
' 引数から取得
Dim BaseData As String = arguments(1)
' 送る為に文字列を URL エンコード( UTF-8 ) する
' System.Web.HttpUtility.UrlEncode
Dim PostData As String = "text=" + HttpUtility.UrlEncode(BaseData)
' 送信するデータの長さを http ヘッダにセット
ServerXML.SetRequestHeader("Content-Length",PostData.Length)
' 送信
ServerXML.send( PostData )
' 結果の表示
Console.WriteLine(ServerXML.responseText)
Console.ReadLine()
End Sub
End Module
この場合日本語の内部エンコードは、UTF-8 で行われます。他のエンコードを
行いたい場合は、HttpUtility.UrlEncode のドキュメントを参照して下さい
エラー処理
Try
ServerXML.send( PostData )
Catch ex As Exception
Console.WriteLine("実行エラーです")
Console.WriteLine( ex.Message )
Return
End Try
url_rfc3986.php
Twitter の API(OAuth) で使われる URL エンコード用のコードです。
VB.net 側ではいずれにしても、URLENCODE は必要なので、一般的なものとして
HttpUtility.UrlEncode で変換したものを送っています。
<?
if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
header( "Content-Type: text/html; Charset=utf-8" );
}
else {
header( "Content-Type: text/plain" );
}
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
foreach( $_POST as $Key => $Value ) {
$_POST[$Key] = str_replace("\\\\", "\\", $Value );
$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}
print url_rfc3986( $_POST['text'] );
// **********************************************************
// AOuth 用の urlencode 関数
// **********************************************************
function url_rfc3986( $str ) {
// php 5.3.x 〜 ではこの変換は必要無い
return str_replace('%7E', '~', rawurlencode($str));
}
?>
<? if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) { ?>
<form method="post">
<textarea name="text"></textarea>
<input type="submit">
</form>
<? } ?>
※ 処理のテストをできるように、アドレスバーから呼び出した場合は入力画面
※ が表示されます。入力して実行した結果が戻される値( text/plain ) です
以下は IE8 で送られた http ヘッダです
POST /api/url_rfc3986.php HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost/api/url_rfc3986.php
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost
Content-Length: 6
Connection: Keep-Alive
Cache-Control: no-cache
text=a
関連する記事
PHP/JavaScript/ASP/ps/py : 処理別の urlencode の結果の違い
VBScript : Seesaaの禁止ワード一括登録