2016-03-02 4 views
6

Так я начал использовать Okhttp 3 и большинство примеров на веб говорить о более старых версияхДобавить куки для запроса клиента OkHttp

мне нужно добавить печенье на запросы клиента OkHttp, как это делается с OkHttp 3 ?

В моем случае я просто хочу, чтобы статически добавить его в клиентских вызовов, не получая с сервера

+0

Вы должны быть более точным на что вы пытаетесь сделать. Может быть, какой-то код? –

+0

@TudorLuca Мне нужно отправить http (get post put) при прикреплении файла cookie к запросу. в Java, например, это делается следующим образом: URL url = новый 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

Спасибо! есть ли у вас пример использования Builder? также, если я хочу установить cookie на уровне домена, а не конкретный полный URL-адрес? –

+0

@MichaelA второе решение с перехватчиком будет работать независимо от вашего URL. –

3

Если вам необходимо установить куки для одного запроса, вы можете просто добавить заголовок:

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

В противном случае, если вы хотите прочитать куки, возвращаемые сервером и прикрепить их к другим запросам, вам нужно будет a 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

Я думаю, что лучший способ сделать это, добавив печенье к cookieJar. OkHttp будет автоматически добавлять печенье на запрос с перехватчиком: 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

У меня были такие же потребности, я создал свою собственную библиотеку. Вы можете force установить такие куки, как это, 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(); 

Gradle

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

Вы должны установить заголовки в объявлении интерфейса, например, так: Call Логин (@Header ("Cookie") Строка sessionId ...)