2014-10-22 15 views
25

Sto usando okhttp 2.0 nella mia app per Android e non ho trovato un modo per impostare un comune User Agent per tutte le richieste in uscita.Come specificare un agente utente predefinito per le richieste okhttp 2.x

ho pensato che avrei potuto fare qualcosa di simile

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

... ma non c'è tale metodo o simili. Ovviamente potrei fornire un metodo di utilità di estensione che comprenda un RequestBuilder per allegare .header("UserAgent") e quindi lo utilizzerei per compilare tutte le mie richieste, ma ho pensato che forse mi mancava un modo esistente e più semplice?

risposta

65

È possibile utilizzare un intercettore per aggiungere l'intestazione User-Agent a tutte le richieste.

Per ulteriori informazioni su okHttp intercettori vedere https://github.com/square/okhttp/wiki/Interceptors

implementazione Esempio di questa intercettore:

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

Test per l'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")); 
} 
+0

Grazie mille, contrassegnando questa risposta come corretta. – dimsuz

+4

Questo è così tanto lavoro che non esiste un'implementazione predefinita per questo genere di cose? – schwiz

7

OkHttp v2.1 che è impostato per essere rilasciato nelle prossime settimane will automatically set a User-Agent intestazione se non è già impostato.

A partire da ora non c'è un buon modo per aggiungere questa intestazione ad ogni richiesta in modo centralizzato. L'unica soluzione è includere l'intestazione manualmente per ogni Request che viene creato.

+0

Grazie, bello sapere che non mi sono perso nulla. Sì, ho riscontrato problemi di github relativi all'impostazione automatica di User-Agent. – dimsuz

+1

Puoi aggiornare la risposta per includere come farlo? Grazie :) – djunod

4

Utilizzando un intercepter non è più necessaria nel versioni più recenti di OkHttp. L'aggiunta di un agente utente è semplice come:

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

Fonte: OkHttp wiki.

+0

Ma questo richiederebbe di farlo per ogni richiesta che invii. Una risposta accettata ha lo stesso codice che hai fornito, eseguito solo all'interno di un intercettore che è una soluzione migliore per il caso in cui tutte le richieste devono avere un determinato User Agent. – dimsuz

+0

Sì, questo è utile solo se si ha un'intestazione fissa. – Saket

Problemi correlati