Как указать агент пользователя по умолчанию для okhttp 2.х запросов

Я использую okhttp 2.0 в своем приложении для Android и не нашел способа установить какой-то общий пользовательский агент для всех исходящих запросов.

Я думал, что смогу сделать что-то вроде

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

...но нет такого метода или подобного. Конечно, я мог бы предоставить некоторый метод утилиты расширения, который обернул бы RequestBuilder для присоединения .header("UserAgent") и тогда я бы использовал его для создания всех моих запросов, но я подумал, может быть, я пропустил какой-то существующий и более простой способ?

4 ответов


вы можете использовать перехватчик для добавления заголовка 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.


основываясь на ответе @josketres, вот аналогичный перехватчик для OkHttp версия 3

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