
javaでAPI通信ログの出力について
はじめに
外部APIと通信をして自システムと外部システム間で連携する機能を実装したときの話です。
連携テストを進めていて、通信されてくるAPIのパスが違うと連絡を受けたので実際に通信している内容を確かめる方法を探していて本記事で記載する内容を実装することで通信ログを出力することができて原因判明まで繋がったのでその体験談です。
使用したライブラリ
okhttpというライブラリを使用しました。
HTTPリクエストを処理する際に使用されるものです。
GradleにOkHttpの追記
Gradleに設定を追記
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
OkHttpClientの作成
HTTPリクエストを実行するためにOkHttpClientインスタンスを作成します。
import okhttp3.OkHttpClient;
OkHttpClient okHttpClient = new OkHttpClient();
実際にAPI通信をするところ
今回は事前にOpenAPI Generatorでクライアントライブラリを作成しているのでそちらを使用して通信を行いました。
以下のような形で設定を行い実際にAPI通信をします。
ApiClient client = Configuration.getDefaultApiClient();
client.setBasePath(URL);
client.setApiKey(apiKey);
Api api = new Api(client);
OkHttpClient okHttpClient = new OkHttpClient();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.build();
client.setHttpClient(okHttpClient);
Timeout系の設定をしていますが、以下のものが定義できます。
1.connectTimeout
応答があるまで何ミリ秒待つか設定できます。
設定した時間内に応答がない場合は接続終了。
2.writeTimeout
データの書き込みをする際に、書き込み処理が完了するまで何ミリ秒待つか設定できます。設定した時間内に完了しなかった場合は、データの書き込みを終了。
3.readTimeout
データを取得する際に、データの取得が完了するまで何ミリ秒待つか設定できます。
設定した時間内に完了しなかった場合は、データの取得を終了。
出力されるログについて
記載したログのようなものが出力されるようになりました。
実際に通信しているURLやレスポンスなども返ってきます。
改変してはいますが、参考までに返ってくる通信のログの内容になります。
2025-02-04 10:03:07.660 okhttp3.OkHttpClient --> GET https://test/yano/list?id=1
2025-02-04 10:03:07.661 okhttp3.OkHttpClient Accept: application/json
2025-02-04 10:03:07.661 okhttp3.OkHttpClient API-KEY: abcdef
2025-02-04 10:03:07.662 okhttp3.OkHttpClient User-Agent: OpenAPI-Generator/1.0.0/java
2025-02-04 10:03:07.662 okhttp3.OkHttpClient --> END GET
2025-02-04 10:03:07.919 okhttp3.OkHttpClient <-- 404 https://test/yano/list?id=1 (256ms)
-- 成功した場合
2025-02-04 10:03:07.919 okhttp3.OkHttpClient <-- 200 https://test/yano/list?id=1 (256ms)
2025-02-04 10:03:07.919 okhttp3.OkHttpClient response~~~~~
最後に
ログを入れたおかげでパスの設定が本当に間違っていたことに気づけましたし、実際に返ってくるデータやHTTPステータスコードも返ってくるので外部との通信があるときは入れておいたほうがこのような調査があったときに便利だと思いました。