私はAndroidアプリでokhttp 2.0を使用していますが、すべての発信リクエストに共通のユーザーエージェントを設定する方法を見つけられませんでした。
私は次のようなことができると思った
_OkHttpClient client = new OkHttpClient();
client.setDefaultUserAgent(...)
_
...しかし、そのような方法などはありません。もちろん、.header("UserAgent")
をアタッチするようにRequestBuilderをラップする拡張ユーティリティメソッドを提供し、それを使用してすべてのリクエストをビルドしますが、既存の簡単な方法を見逃したのではないかと思いましたか?
インターセプターを使用して、User-Agentヘッダーをすべてのリクエストに追加できます。
OkHttpインターセプターの詳細については、「 https://github.com/square/okhttp/wiki/Interceptors 」を参照してください
このインターセプターの実装例:
/* This interceptor adds a custom User-Agent. */
public class UserAgentInterceptor implements Interceptor {
private final String userAgent;
public UserAgentInterceptor(String userAgent) {
this.userAgent = userAgent;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Request requestWithUserAgent = originalRequest.newBuilder()
.header("User-Agent", userAgent)
.build();
return chain.proceed(requestWithUserAgent);
}
}
UserAgentInterceptorのテスト:
public void testUserAgentIsSetInRequestHeader() throws Exception {
MockWebServer server = new MockWebServer();
server.enqueue(new MockResponse().setBody("OK"));
server.play();
String url = server.getUrl("/").toString();
OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new UserAgentInterceptor("foo/bar"));
Request testRequest = new Request.Builder().url(url).build()
String result = client.newCall(testRequest).execute().body().string();
assertEquals("OK", result);
RecordedRequest request = server.takeRequest();
assertEquals("foo/bar", request.getHeader("User-Agent"));
}
数週間以内にリリースされるように設定されているOkHttp v2.1 自動的に設定されます a User-Agent
ヘッダー(設定されていない場合)。
現時点では、このヘッダーをすべてのリクエストに一元的に追加する良い方法はありません。唯一の回避策は、作成されるRequest
ごとにヘッダーを手動で含めることです。
OkHttpの新しいバージョンではインターセプターを使用する必要がなくなりました。ユーザーエージェントの追加は次のように簡単です。
Request request = new Request.Builder()
.url("http://www.publicobject.com/helloworld.txt")
.header("User-Agent", "OkHttp Example")
.build();
ソース: OkHttp wiki 。
誰かがOkHttp 3とKotlinでこれを使用して探している場合:
val client = OkHttpClient.Builder()
.addNetworkInterceptor { chain ->
chain.proceed(
chain.request()
.newBuilder()
.header("User-Agent", "COOL APP 9000")
.build()
)
}
.build()
@josketresの回答に基づいて、ここにOkHttpバージョンの同様のインターセプターがあります
public class UserAgentInterceptor implements Interceptor {
private final String mUserAgent;
public UserAgentInterceptor(String userAgent) {
mUserAgent = userAgent;
}
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
Request request = chain.request().newBuilder().header("User-Agent", mUserAgent).build();
return chain.proceed(request);
}
}
さらに、更新されたテスト:
@Test
public void testUserAgentIsSetInRequestHeader() throws IOException, InterruptedException {
final String expectedUserAgent = "foo/bar";
MockWebServer server = new MockWebServer();
server.enqueue(new MockResponse().setBody("OK"));
server.start();
OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
okHttpBuilder.addInterceptor(new UserAgentInterceptor(expectedUserAgent));
Request request = new Request.Builder().url(server.url("/").url()).build();
ResponseBody result = okHttpBuilder.build().newCall(request).execute().body();
assertNotNull(result);
assertEquals("OK", result.string());
assertEquals(expectedUserAgent, server.takeRequest().getHeader("User-Agent"));
}