Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Вы можете использовать перехватчик, чтобы добавить заголовок 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"));
}

Ответ 2

OkHttp v2.1, который будет выпущен в ближайшие несколько недель, автоматически установит заголовок User-Agent, если он еще не установлен.

На данный момент нет хорошего способа добавить этот заголовок к каждому запросу централизованно. Единственным обходным решением является включение заголовка вручную для каждого созданного Request.

Ответ 3

Использование перехватчика больше не требуется в новых версиях OkHttp. Добавление пользовательского агента так же просто, как:

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

Источник: OkHttp wiki.