とあるWebAPIサービスを提供しているサイトへアクセスするクライアントをjavaで書こうかと、最初はjerseyを試してみたのですが、これがなかなか厄介で、次から次と依存が判明して動作するまで一苦労。。
最終的には、とあるサイト側の認証における制約により、jerseyの仕様ではどうやってもアクセスが出来ない事が判明。。
失敗の原因は概ね当たりが付いていたので、その辺りに問題が無さそうなライブラリとしてgoogle-http-clientを使うことにしました。
jerseyで途中まで実装していたものをそのままgoogle-http-clientを使う形に置き換えて疎通確認レベルまでやってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
String jsonStr = "{¥"param1¥" : ¥"XXXXX¥"}"; HttpTransport transport = new ApacheHttpTransport(); HttpRequestFactory factory = transport.createRequestFactory(); GenericUrl url = new GenericUrl("https://aaa.bbb.jp/api/method"); HttpRequest request = factory.buildPostRequest(url, ByteArrayContent.fromString("application/json", jsonStr )); request.setConnectTimeout(30 * 1000); request.setReadTimeout(60 * 1000); HttpHeaders headers = request.getHeaders(); headers.setContentType("application/json"); headers.set("x-header1", "xxxxx"); headers.set("x-header2", "yyyyy"); String accessToken = generateToken(); //こちらはサイト要件に合わせて別途用意 headers.setAuthorization(accessToken); response = request.execute(); try{ String respJsonStr = response.parseAsString(); } finally { response.disconnect(); } //パース処理に続く・・・ |
google-http-clientは依存が無く構成がとてもシンプルで置き換えた途端に、サックリとAPIアクセスに成功しました。proxy経由でもJVM引数で指定してあっさり通りました。
細かいところでは、どうも指定したタイムアウトは効いてないような気がしますが、まあ、今回の実務上問題無さそうなので、利用しやすいように整理して実装しようと思います。
だいぶ経って2019年1月現在、久しぶりに使ってみると、当時のバージョン1.23と現在の1.28では仕様が変わっており上記のままでは動かなくなりました。。