web-dev-qa-db-ja.com

okhttp 2.xリクエストのデフォルトユーザーエージェントを指定する方法

私はAndroidアプリでokhttp 2.0を使用していますが、すべての発信リクエストに共通のユーザーエージェントを設定する方法を見つけられませんでした。

私は次のようなことができると思った

_OkHttpClient client = new OkHttpClient();
client.setDefaultUserAgent(...)
_

...しかし、そのような方法などはありません。もちろん、.header("UserAgent")をアタッチするようにRequestBuilderをラップする拡張ユーティリティメソッドを提供し、それを使用してすべてのリクエストをビルドしますが、既存の簡単な方法を見逃したのではないかと思いましたか?

37
dimsuz

インターセプターを使用して、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"));
}
81
josketres

数週間以内にリリースされるように設定されているOkHttp v2.1 自動的に設定されます a User-Agentヘッダー(設定されていない場合)。

現時点では、このヘッダーをすべてのリクエストに一元的に追加する良い方法はありません。唯一の回避策は、作成されるRequestごとにヘッダーを手動で含めることです。

10
Jake Wharton

OkHttpの新しいバージョンではインターセプターを使用する必要がなくなりました。ユーザーエージェントの追加は次のように簡単です。

Request request = new Request.Builder()
    .url("http://www.publicobject.com/helloworld.txt")
    .header("User-Agent", "OkHttp Example")
    .build();

ソース: OkHttp wiki

7
Saket

誰かがOkHttp 3とKotlinでこれを使用して探している場合:

val client = OkHttpClient.Builder()
    .addNetworkInterceptor { chain ->
      chain.proceed(
          chain.request()
              .newBuilder()
              .header("User-Agent", "COOL APP 9000")
              .build()
      )
    }
    .build()
4
willcwf

@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"));
}
3
friederbluemle