2016-03-02 11 views
6

So begann ich mit Okhttp 3 und die meisten Beispiele im Web Diskussion über ältere VersionenCookie auf Client-Anfrage OkHttp

Ich brauche einen Cookie an den OkHttp Client-Anfragen an, wie wird es gemacht mit OkHttp 3 ?

In meinem Fall möchte ich einfach zu statisch zu Client Anrufe hinzufügen, ohne dass sie vom Server zu empfangen

+0

Sie müssen genauer auf sein was du versuchst zu tun. Vielleicht ein Code? –

+0

@TudorLuca Ich muss http (Post erhalten) beim Anfügen von Cookie an die Anfrage senden. in Java zum Beispiel: URL URL = neue URL ("http://www.google.com:80"); URLConnection conn = url.openConnection(); conn.setRequestProperty ("Cookie", "Name1 = Wert1; Name2 = Wert2"); conn.connect(); –

Antwort

13

Es gibt zwei Möglichkeiten, wie Sie dies tun:

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(); 
    } 

oder einfach

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(); 

Ich habe das Gefühl, dass der zweite Vorschlag ist, was Sie brauchen.

Sie können here ein funktionierendes Beispiel finden.

+0

danke für die Hilfe, können Sie mir sagen, wie man ein okhttp3.Cookie konstruieren? –

+0

Danke! Haben Sie ein Beispiel für den Cookie-Builder? auch, wenn ich Cookie auf der Domain-Ebene und nicht eine bestimmte vollständige URL setzen möchte? –

+0

@MichaelA Die zweite Lösung mit dem Interceptor funktioniert unabhängig von Ihrer URL. –

3

Wenn Sie ein Cookie für eine einzelne Anforderung einstellen müssen hinzufügen Sie können nur den Header:

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

Andernfalls, wenn Sie vom Server zurück Cookies lesen möchten und sie an andere Anforderungen müssen Sie a CookieJar. Für Android können Sie die PersistentCookieJar library verwenden, die Cookies richtig und auch speichert sie in den gemeinsamen Vorlieben Griffe:

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

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

Versuchte Einstellung der Kopfzeile aber es scheint nicht zu funktionieren, auf der Serverseite wird kein Cookie empfangen –

+1

Versuchen Sie es mit addHeader ("Cookie", "key = value")? –

+0

Nur getestet und es funktioniert nicht, der Server erhält das Cookie nicht – furiel

0

denke ich, einen besseren Weg, dies zu tun ist durch das Cookie an den CookieJar hinzufügen. OkHttp wird dann automatisch um die Cookies auf die Anfrage mit einem Interceptor: 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) 

ich diesen Code eigentlich nicht versuchen, aber es sollte funktionieren.

0

Ich hatte die gleichen Bedürfnisse, ich habe meine eigene Bibliothek. Sie können zwingen Cookies wie folgt mit OkHttp3CookieHelper auf https://github.com/riversun/okhttp3-cookie-helper setzen.

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

Sie sollten Header in der Interface-Deklaration festgelegt, etwa so: Rufen Sie login (@Header ("Cookie") String sessionId ...)