web-dev-qa-db-fra.com

Comment spécifier un agent utilisateur par défaut pour les requêtes okhttp 2.x

J'utilise okhttp 2.0 dans mon Android et je n'ai pas trouvé de moyen de définir un agent utilisateur commun pour toutes les demandes sortantes.

Je pensais pouvoir faire quelque chose comme

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

... mais il n'y a pas une telle méthode ou similaire. Bien sûr, je pourrais fournir une méthode d'utilitaire d'extension qui envelopperait un RequestBuilder pour attacher .header("UserAgent") et ensuite je l'utiliserais pour construire toutes mes demandes, mais je pensais que j'avais peut-être raté un moyen existant et plus simple?

37
dimsuz

Vous pouvez utiliser un intercepteur pour ajouter l'en-tête User-Agent à toutes vos demandes.

Pour plus d'informations sur les intercepteurs okHttp, voir https://github.com/square/okhttp/wiki/Interceptors

Exemple d'implémentation de cet intercepteur:

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

Testez 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 qui devrait sortir dans les prochaines semaines sera automatiquement défini a User-Agent en-tête s'il n'y en a pas déjà un.

À l'heure actuelle, il n'existe pas de bon moyen d'ajouter cet en-tête à chaque demande de manière centralisée. La seule solution consiste à inclure manuellement l'en-tête pour chaque Request créé.

10
Jake Wharton

L'utilisation d'un intercepteur n'est plus requise dans les nouvelles versions d'OkHttp. L'ajout d'un agent utilisateur est aussi simple que:

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

Source: wiki OkHttp .

7
Saket

Au cas où quelqu'un chercherait à travailler avec OkHttp 3 et dans Kotlin:

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

Basé sur la réponse de @josketres, voici un intercepteur similaire pour OkHttp version

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

Plus le test mis à jour:

@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