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になります。
参考
以下を参考にさせていただきました。
- HttpClientでの認証(HttpClient3.0-rc3)
- プロキシ経由でHTTP接続(Proxy認証) - StackTrace
- Delegate で Proxy 認証(テストにDelegateを使いました)