studio library android square okhttp

android - library - Cómo especificar un agente de usuario predeterminado para las solicitudes de okhttp 2.x



okhttp maven (4)

El uso de un interceptor ya no es necesario en las versiones más recientes de OkHttp. Agregar un agente de usuario es tan simple como:

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

Fuente: https://github.com/square/okhttp/wiki/Interceptors .

Estoy usando okhttp 2.0 en mi aplicación de Android y no encontré la manera de configurar un agente de usuario común para todas las solicitudes salientes.

Pensé que podría hacer algo como

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

... pero no hay tal método o similar. Por supuesto, podría proporcionar algún método de utilidad de extensión que envuelva un RequestBuilder para adjuntar .header("UserAgent") y luego lo usaría para .header("UserAgent") todas mis solicitudes, pero pensé que tal vez me perdí alguna forma existente y más simple.


OkHttp v2.1, que se lanzará en las próximas semanas , configurará automáticamente un encabezado User-Agent si aún no está configurado.

Por el momento, no hay una buena manera de agregar este encabezado a cada solicitud de forma centralizada. La única solución es incluir el encabezado manualmente para cada Request que se crea.


Puede usar un interceptor para agregar el encabezado User-Agent a todas sus solicitudes.

Para obtener más información sobre los interceptores okHttp, consulte https://github.com/square/okhttp/wiki/Interceptors

Ejemplo de implementación de este interceptor:

/* 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); } }

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


Según la respuesta de @josketres, aquí hay un interceptor similar para la versión 3 de 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); } }

Además de la prueba actualizada:

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