読者です 読者をやめる 読者になる 読者になる

HttpClientメモ

HttpClientで、プロキシサーバを使ったり、認証が必要なサーバにアクセスする場合のメモです。

プロキシサーバ&プロキシ認証

// HttpClientのインスタンスを生成
HttpClient client = new HttpClient();

// プロキシサーバの情報
String proxyHost = "127.0.0.1";
int proxyPort = 8080;

// プロキシサーバとポートを指定
client.getHostConfiguration().setProxy(proxyHost, proxyPort);

// プロキシ認証で使用するパスワードを指定(Basic認証の場合)
client.getState().setProxyCredentials(
	new AuthScope(proxyHost, proxyPort),
	new UsernamePasswordCredentials("username", "password"));

GetMethod method = null;
try {
	// GETでアクセス
	method = new GetMethod("http://www.yahoo.co.jp");
	client.executeMethod(method);
	System.out.println(method.getResponseBodyAsString());
} catch (HttpException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
} finally{
	if(method != null){
		method.releaseConnection();
	}
}

認証

String host = "ホスト名";
int port = 80;

client.getState().setCredentials(
		new AuthScope(host, port, AuthScope.ANY_REALM), // すべてのRealmで認証を行う
		new UsernamePasswordCredentials("username", "password")); // ユーザ名とパスワードを指定

GetMethod method = new GetMethod(url);

// デフォルトでtrueみたいなので明示的に指定しなくてもよい??
method.setDoAuthentication(true);

CredentialsProviderを使う

上記のsetCredentialsを使って認証情報を設定する以外に、CredentialsProviderインタフェースを実装したクラスを設定しておくと、認証が必要になった場合にgetCredentialsメソッドが呼び出されます。Hostに応じてDBから認証情報をとってきたい場合などに使用できます。AuthSchemeには認証方法(Basic, Digest, NTLM等)に対応したクラスのインスタンスが渡されます。

public class SimpleCredentialsProvider implements CredentialsProvider {
	@Override
	public Credentials getCredentials(AuthScheme scheme, String host, int port, boolean proxy) throws CredentialsNotAvailableException {
		// ここでhostや認証方法に応じたCredentialsを生成する
		return new UsernamePasswordCredentials("username", "password");
	}
}

HttpClientに設定します。

HttpClient client = new HttpClient();
client.getParams().setParameter(CredentialsProvider.PROVIDER, new SimpleCredentialsProvider());

認証に失敗した場合には再度getCredentialsが呼び出されるため、上記の例では間違ったCredentialsだと無限ループしてしまいます。ただし、認証に失敗したのかどうかを判定する方法がわかりませんでした。引数として渡される情報には含まれていないようなので、インスタンス変数などで管理する必要があるのかもしれません。

また、プロキシ認証が必要なケースで、setProxyCredentialsでCredentialsを設定していない場合にもgetCredentialsが呼び出されます。その場合には、proxy引数がtrueになります。

参考

以下を参考にさせていただきました。