Add cookies to retrofit 2 request Add cookies to retrofit 2 request android android

Add cookies to retrofit 2 request


First of all: cookie is not the same as a header. Cookie is a special HTTP header named Cookie followed by list of the pairs of keys and values (separated by ";"). Something like:

Cookie: sessionid=sessionid; token=token

Since you cannot set multiple Cookie headers in the same request you are not able to use two @Header annotations for separate values (sessionid and token in your sample). I can think of one very hacky workaround:

@GET("link")Call<CbGet> getData(@Header("Cookie") String sessionIdAndToken);

You change your method to send sessionId and token in one string. So in this case you should manually generate cookie string beforehand. In your case sessionIdAndToken String object should be equal to "sessionid=here_goes_sessionid; token=here_goes_token"

The proper solution is to set cookies by adding OkHttp's (that is library Retrofit uses for making underlying http calls) request interceptor. You can see solution or adding custom headers here.


why not using the cookieJar option?

new Retrofit.Builder()    .baseUrl(BASE_URL)    .client(        new OkHttpClient().newBuilder()            .cookieJar(new SessionCookieJar()).build())    .build();private static class SessionCookieJar implements CookieJar {    private List<Cookie> cookies;    @Override    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {        if (url.encodedPath().endsWith("login")) {            this.cookies = new ArrayList<>(cookies);        }    }    @Override    public List<Cookie> loadForRequest(HttpUrl url) {        if (!url.encodedPath().endsWith("login") && cookies != null) {            return cookies;        }        return Collections.emptyList();    }}


to add cookie header to okhttp request headers , add this in Interceptor:

request= request.newBuilder().addHeader("Cookie", sessionIdAndToken).build();

Ref:https://github.com/square/okhttp/wiki/Interceptors as mentioned by @Alexander Mironov

Full Example code here: Hope it helps you

import okhttp3.Interceptor;import okhttp3.Request;import okhttp3.Response;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.util.List;public class LoggingInterceptor implements Interceptor {    private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);    @Override    public Response intercept(Interceptor.Chain chain) throws IOException {        Request request = chain.request();        long t1 = System.nanoTime();        request = processRequest(request);        logger.info("Sending request with url:{} and connection status:{} and request headers:{}",                request.url(), chain.connection(), request.headers());        Response response = chain.proceed(request);        long t2 = System.nanoTime();        logger.info("Received response for url:{} and time taken:{} and response headers as:{}",                response.request().url(), (t2 - t1) / 1e6d, response.headers());        response = processResponse(response);        return response;    }    //Add cookies for all subsequent requests    private Request processRequest(Request request) {        if(!request.url().toString().contains("/v1/authorize")) {            final EmployeeSession session = getSession();            StringBuilder etokenAndUId = new StringBuilder("etoken=");            etokenAndUId.append(session.getEtoken()).append(";").append("uId=").append(session.getUId());            logger.info("inside processRequest for all subsequent requests, sending cookies as etokenAndUId values:{}", etokenAndUId.toString());            request= request.newBuilder().addHeader("Cookie", etokenAndUId.toString()).build();        }        return request;    }    //Extract cookies from login url    private Response processResponse(Response response) {        if(response.request().url().toString().contains("/v1/authorize")) {            final List<String> cookieHeaders = response.headers("Set-Cookie");            String etoken = "", uId = "";            for (String cookieHeader : cookieHeaders) {                if(cookieHeader.contains("etoken=")) {                    etoken = cookieHeader.substring(7, cookieHeader.indexOf(';'));                }                else if(cookieHeader.contains("uId=")) {                    uId = cookieHeader.substring(4, cookieHeader.indexOf(';'));                }            }            logger.info("inside processResponse found cookies from login url response: etoken:{} and uid:{}", etoken, uId);            setSession(etoken, uId, "c1");            logger.info("current employee session:{}", getSession());        }        return response;    } }