2014-10-22 4 views
25

Ich benutze okhttp 2.0 in meiner Android App und habe keine Möglichkeit gefunden einen allgemeinen User Agent für alle ausgehenden Anfragen zu setzen.Wie gebe ich einen Standard User Agent für okhttp 2.x Anfragen an

Ich dachte, ich so etwas wie

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

tun könnte ... aber es gibt keine solche Verfahren oder ähnliches. Natürlich könnte ich eine Erweiterung Utility-Methode, die einen RequestBuilder umschließen würde, um .header("UserAgent") anhängen und dann würde ich es für die Erstellung aller meiner Anfragen verwenden, aber ich dachte, vielleicht habe ich einige bestehende und einfachere Weg verpasst?

Antwort

65

Sie können einen Interceptor verwenden, um den User-Agent-Header all Ihren Anforderungen hinzuzufügen.

Weitere Informationen über okHttp Abfangjäger https://github.com/square/okhttp/wiki/Interceptors

Beispiel Durchführung dieses Interceptor sehen:

/* 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 zur 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

Vielen Dank, diese Antwort als richtig zu markieren. – dimsuz

+4

Das ist so viel Arbeit gibt es keine Standard-Implementierung für diese Art von Sache? – schwiz

7

OkHttp v2.1, das in den nächsten Wochen freigegeben wird will automatically set ein Header, wenn einer noch nicht festgelegt ist.

Ab sofort gibt es keine gute Möglichkeit, diesen Header zu jeder Anfrage auf eine zentrale Weise hinzuzufügen. Die einzige Problemumgehung besteht darin, den Header manuell für jede Request, die erstellt wird, einzuschließen.

+0

Danke, gut zu wissen, ich habe nichts vermisst. Ja, ich habe ein github-Problem bezüglich der automatischen Einstellung von User-Agent gesehen. – dimsuz

+1

Können Sie die Antwort aktualisieren, um zu erfahren, wie es geht? Danke :) – djunod

4

ein intercepter Verwendung ist nicht mehr erforderlich, in dem neuere Versionen von OkHttp. ein User-Agent Hinzufügen ist so einfach wie:

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

Quelle: OkHttp wiki.

+0

Aber das würde erfordern, dass Sie es für jede Anfrage tun, die Sie senden. Eine angenommene Antwort hat den gleichen Code, den Sie angegeben haben. Sie wird nur innerhalb eines Interceptors ausgeführt, was eine bessere Lösung für den Fall darstellt, in dem alle Anfragen einen bestimmten Benutzeragenten haben müssen. – dimsuz

+0

Ja, das ist nur nützlich, wenn Sie eine feste Kopfzeile haben. – Saket