2016-03-02 41 views
6

所以,我開始使用Okhttp 3,大部分在網絡上談舊版本添加cookie來的客戶端請求OkHttp

我需要添加一個cookie的OkHttp客戶端請求的例子,它是如何與OkHttp 3完成?

在我來說,我只是想靜態地將它添加到客戶端調用,而不從服務器接收它

+0

你需要更精確的你在做什麼。也許有些代碼? –

+0

@TudorLuca我需要發送http(獲取帖子),同時將cookie附加到請求。在Java中,例如它是這樣完成的:URL url = new URL(「http://www.google.com:80」); URLConnection conn = url.openConnection(); conn.setRequestProperty(「Cookie」,「name1 = value1; name2 = value2」); conn.connect(); –

回答

13

有2種方法可以做到這一點:

OkHttpClient client = new OkHttpClient().newBuilder() 
       .cookieJar(new CookieJar() { 
        @Override 
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { 
        } 

        @Override 
        public List<Cookie> loadForRequest(HttpUrl url) { 
         final ArrayList<Cookie> oneCookie = new ArrayList<>(1); 
         oneCookie.add(createNonPersistentCookie()); 
         return oneCookie; 
        } 
       }) 
       .build(); 
... 

public static Cookie createNonPersistentCookie() { 
     return new Cookie.Builder() 
       .domain("publicobject.com") 
       .path("/") 
       .name("cookie-name") 
       .value("cookie-value") 
       .httpOnly() 
       .secure() 
       .build(); 
    } 

或者乾脆

OkHttpClient client = new OkHttpClient().newBuilder() 
     .addInterceptor(new Interceptor() { 
      @Override 
      public Response intercept(Chain chain) throws IOException { 
       final Request original = chain.request(); 

       final Request authorized = original.newBuilder() 
         .addHeader("Cookie", "cookie-name=cookie-value") 
         .build(); 

       return chain.proceed(authorized); 
      } 
     }) 
     .build(); 

我有一種感覺,第二個建議是你需要的。

你可以找到here一個工作示例。

+0

感謝您的幫助,您能告訴我如何構建okhttp3.Cookie嗎? –

+0

謝謝!你有使用Cookie構建器的例子嗎?另外,如果我想在域級別設置cookie而不是特定的完整url? –

+0

@Michael第二種解決方案,攔截器,無論你的網址是什麼,都可以工作。 –

3

如果您需要設置一個cookie單個請求你可以添加標題:

Request request = new Request.Builder() 
     .addHeader("Cookie", "yourcookie") 
     .url("http://yoursite.com") 
     .build(); 

否則,如果你想閱讀由服務器返回的cookie,並將它們連接到你需要的其他請求一個CookieJar。對於Android的你可以使用正確處理餅乾PersistentCookieJar library,而且可以節省他們在共享偏好:

ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context)); 

OkHttpClient okHttpClient = new OkHttpClient.Builder() 
       .cookieJar(cookieJar) 
       .build(); 
+0

嘗試設置標題,但它似乎不起作用,在服務器端沒有收到cookie –

+1

嘗試使用addHeader(「Cookie」,「key = value」)? –

+0

剛剛測試過,它不起作用,服務器沒有收到cookie – furiel

0

我認爲更好的方式來做到這一點是通過將cookie發送到cookieJar。 OkHttp將自動與攔截器的Cookie添加到請求:https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/internal/http/BridgeInterceptor.java

cookieManager = new CookieManager(); 
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager); 
// add cookies to cookiejar 
cookieJar.saveFromResponse("Cookie", listOfCookiesToAdd); 

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.cookieJar(cookieJar) 

我其實沒有嘗試這個代碼,但它應該工作。

0

我有同樣的需求,我做了自己的圖書館。 您可以強制用OkHttp3CookieHelper在https://github.com/riversun/okhttp3-cookie-helper上設置這樣的餅乾。

String url = "https://example.com/webapi"; 

    OkHttp3CookieHelper cookieHelper = new OkHttp3CookieHelper(); 
    cookieHelper.setCookie(url, "cookie_name", "cookie_value"); 

    OkHttpClient client = new OkHttpClient.Builder() 
      .cookieJar(cookieHelper.cookieJar()) 
      .build(); 

    Request request = new Request.Builder() 
      .url(url) 
      .build(); 

搖籃

compile 'org.riversun:okhttp3-cookie-helper:1.0.0' 

Maven的

<dependency> 
<groupId>org.riversun</groupId> 
<artifactId>okhttp3-cookie-helper</artifactId> 
<version>1.0.0</version> 
</dependency> 
0

你應該設置頭在接口聲明,如下所示:調用login(@Header( 「曲奇」)字符串sessionId ...)