Как указать агент пользователя по умолчанию для 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"));
}