HttpClient2.0でダミークライアントを作ってみる

感想おまちしてます!

HttpClientのサイトがHttpComponentsってサイトになってますね。

HTTPプロトコルを使ってアクセスするのはブラウザが簡単なんだけど、

  • ヘッダ部にこういう情報入れたい
  • body部にCSVとかXMLを入れたい

ときとかにブラウザだとしんどい。

そこで、HttpClientをつかって擬似クライアントを作ってみる。

スポンサーリンク

今回の仕様 

  • 送信先、送信対象ファイル置き場は引数で指定する。
  • 指定したディレクトリにあるファイルをHTTPのBodyに設定して送信する。
  • リクエストはファイル1に対して1送信される。
  • レスポンスはファイルで出力される。

DummyClientクラス 

アクセッサなどは省略してます。

/**
* ダミークライアント
*
* @author Dai Fujihara
*
* 2005/12/20 16:34:29
*/
public class DummyClient {

/** HTTPクライアントオブジェクト */
private HttpClient httpClient = new HttpClient();

/** リクエストするURL */
private String serverURL;
/** 読み込むディレクトリ */
private String targetDir;
/** 送受信時に使用するエンコード */
private String encode;

/**
* メイン
* args[0]・・・リクエストするURL
* args[1]・・・読み込むディレクトリ
* args[2]・・・送受信時に使用するエンコード
*
* @param args 引数
*/
public static void main(String[] args) {

DummyClient client = new DummyClient();

if(args == null || args.length < 2){
System.out.println("DummyClient.main:引数が不正です。
args[0]=リクエストするURL。args[1]=読み込むディレクトリ。
args[2]=エンコード(任意:デフォルトはShift_JIS)");
}

client.setServerURL(args[0]);
client.setTargetDir(args[1]);

if(args.length > 2) {
client.setEncode(args[2]);
} else {
client.setEncode("Shift_JIS");
}

try{
client.execute();
}catch(SystemException e){
System.out.println("DummyClient.main:" + e.getMessage());
}

System.out.println("DummyClient.main:end.");
}


/**
* コンストラクタ
*/
public DummyClient() {}

/**
* 指定されたディレクトリにあるファイルの数だけHTTPリクエストを送信します。
* 送信時にファイルに書かれた情報をHTTPリクエストのBodyに設定します。
*
* @throws SystemException
*/
public void execute() throws SystemException{

File dir = new File(getTargetDir());
List fileNames = fileNames = IOTool.getFileNames(dir);

for(int i = 0; i < fileNames.size(); i++){

String requestFileName = getTargetDir() + "\\" + fileNames.get(i);
String responseFileName = requestFileName;
File requestFile = new File(requestFileName);
File responseFile = new File(responseFileName + ".response.txt");

try {

PostMethod postMethod = new PostMethod(getServerURL());
postMethod.setHttp11(true);
postMethod.setRequestHeader("Content-Type", "text/plain; charset=" + getEncode());

byte[] request = readRequestFromFile(requestFile);
postMethod.setRequestBody(new String(request, getEncode()));

httpClient.executeMethod(postMethod);

writeResponseToFile(responseFile, postMethod.getResponseBody());

} catch (Exception e) {
e.printStackTrace();
throw new SystemException("responseファイル作成に失敗しました。");
}
}

}

/**
* ファイル読みこみ
*
* @param aFile requestファイル
* @return ファイルの内容
* @throws IOException 入出力エラー
*/
private byte[] readRequestFromFile(File aFile) throws IOException {

BufferedInputStream bis = null;
ByteArrayOutputStream baos = null;

try {
bis = new BufferedInputStream(new FileInputStream(aFile));
baos = new ByteArrayOutputStream(512);

int size = -1;
byte[] buffer = new byte[256];
while ((size = bis.read(buffer, 0, buffer.length)) != -1) {
baos.write(buffer, 0, size);
}
} finally {
if (bis != null) {
bis.close();
}
}

return baos.toByteArray();
}

/**
* ファイル書き込み
*
* @param aFile responseファイル
* @param aData ファイルの内容
* @throws IOException 入出力エラー
*/
private void writeResponseToFile(File aFile, byte[] aData) throws IOException {

BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(aFile));
bos.write(aData, 0, aData.length);
} finally {
if (bos != null) {
bos.close();
}
}
}
  • PostMethodクラスを使うとPostされる
  • PostMethod.setRequestHeaderを利用してヘッダを設定
  • 読み込んだファイルをPostMethod.setRequestBodyで設定
  • HttpClient.executeMethodで送信実行
  • responseはPostMethod.getResponseBodyで取得

出力されるレスポンスファイルはこんな感じになった。
リクエスト先はHTTPリクエストのBodyを取り出して表示してくれるサーブレット

//requestファイル
ここがBodyにはいってほしいのですわこれが。
//responseファイル
<html>
<head>
<title>HTTP Confirm</title>
</head>
<body>
<table border='1'>
<tr>
<td>body</td>
<td>ここがBodyにはいってほしいのですわこれが。</td>
</tr></table>
</body>
</html>

ちゃんと入ってますね。