2014-10-22 19 views
25

Tôi đang sử dụng okhttp 2.0 trong ứng dụng Android của mình và không tìm cách đặt một số Tác nhân người dùng chung cho tất cả các yêu cầu gửi đi.Cách chỉ định tác nhân người dùng mặc định cho các yêu cầu okhttp 2.x

Tôi nghĩ tôi có thể làm một cái gì đó giống như

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

... nhưng không có phương pháp hoặc tương tự như vậy. Tất nhiên tôi có thể cung cấp một số phương pháp tiện ích mở rộng sẽ bao gồm một RequestBuilder đính kèm .header("UserAgent") và sau đó tôi sẽ sử dụng nó để xây dựng tất cả các yêu cầu của tôi, nhưng tôi nghĩ có lẽ tôi đã bỏ lỡ một số cách hiện có và đơn giản hơn?

Trả lời

65

Bạn có thể sử dụng trình chặn để thêm tiêu đề Tác nhân người dùng cho tất cả các yêu cầu của mình.

Để biết thêm thông tin về okHttp chặn thấy https://github.com/square/okhttp/wiki/Interceptors

thực hiện Ví dụ về đánh chặn này:

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

thử nghiệm cho 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

Cảm ơn bạn rất nhiều, đánh dấu câu trả lời này là chính xác. – dimsuz

+4

Đó là rất nhiều công việc là không có thực hiện mặc định cho loại điều? – schwiz

7

OkHttp v2.1 được thiết lập sẽ được phát hành trong vài tuần tới will automatically set tiêu đề User-Agent nếu chưa được đặt.

Hiện tại, không có cách nào tốt để thêm tiêu đề này vào mọi yêu cầu theo cách tập trung. Cách giải quyết duy nhất là bao gồm tiêu đề theo cách thủ công cho mỗi Request được tạo.

+0

Cảm ơn, rất vui được biết tôi đã không bỏ lỡ bất cứ điều gì. Có, tôi đã thấy một vấn đề về github về cài đặt tự động của Tác nhân người dùng. – dimsuz

+1

Bạn có thể cập nhật câu trả lời để bao gồm cách thực hiện không? Cảm ơn :) – djunod

4

Sử dụng một intercepter không còn cần thiết trong các phiên bản mới hơn của OkHttp. Thêm tác nhân người dùng đơn giản như:

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

Nguồn: OkHttp wiki.

+0

Nhưng điều đó sẽ yêu cầu bạn làm điều đó cho mọi yêu cầu bạn gửi. Câu trả lời được chấp nhận có cùng mã mà bạn đã cung cấp, chỉ chạy bên trong trình chặn chặn là giải pháp đẹp hơn cho trường hợp tất cả yêu cầu phải có một Tác nhân người dùng nhất định. – dimsuz

+0

Có, điều này chỉ hữu ích nếu bạn có tiêu đề cố định. – Saket

Các vấn đề liên quan