How to retrieve cookie from response retrofit, okhttp?

Anurag Dhunna picture Anurag Dhunna · Jan 4, 2018 · Viewed 14.1k times · Source

I am trying to retrieve Cookies values from API response for maintaining the backend session by setting cookie value to new API call in case the APP is closed :

The response to API call from PostMan RestClient: enter image description here

RetrofitClient.java

public static Retrofit getClient() {

    if (checkClient()) {
        return getRetrofit();
    }

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    CookieHandler cookieHandler = new CookieManager();

    okhttp3.OkHttpClient client = new okhttp3.OkHttpClient.Builder().addNetworkInterceptor(interceptor)
            .cookieJar(new JavaNetCookieJar(cookieHandler))
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();

    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .client(client)
            .build();
    return retrofit;
}

API Call

private void userLogin(String username, String password) {
    Retrofit retrofit = RetrofitClient.getClient();

    final LoginServices loginServices = retrofit.create(LoginServices.class);
    Call<LoginResponse> call = loginServices.userLogin(username, password);

    call.enqueue(new Callback<LoginResponse>() {
        @Override
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
            Log.d("Response code:", "===========" + response.code());

            Log.d("==Cookie==1===", "==="+response.raw().request().headers().get("Cookie"));
            Log.d("==Cookie==2==", "==="+response.headers().get("Cookie"));
            Log.d("==Content-Type====", "==="+response.headers().get("Content-Type"));

        }

        @Override
        public void onFailure(Call<LoginResponse> call, Throwable t) {
            Log.e("TAG", "=======onFailure: " + t.toString());
            t.printStackTrace();
            // Log error here since request failed
        }
    });
}

Logcat:

Response code:: ===========200
==Cookie==1===: ===null
==Cookie==1===: ===null
==Content-Type====: ===application/json

I also tried other various methods they didn't worked for me. Please Help!

Answer

Rajan Maurya picture Rajan Maurya · Jan 19, 2018

Header name is "Set-Cookie" not "Cookie" and by the way

The approach you are taking It not proper. If you want to save the Cookie, you can create an interceptor and save the Cookie and use later whenever you want to use.

Here what you have to do, First create an interceptor

public class ReceivedCookiesInterceptor implements Interceptor {

PreferencesHelper preferencesHelper;

public ReceivedCookiesInterceptor(Context context) {
    FineractApplication.get(context).getComponent().inject(this);
    preferencesHelper = PreferencesHelper(context)
}

@Override
public Response intercept(Chain chain) throws IOException {
    Response originalResponse = chain.proceed(chain.request());

    if (!originalResponse.headers("Set-Cookie").isEmpty()) {
        HashSet<String> cookies = new HashSet<>();
        for (String header : originalResponse.headers("Set-Cookie")) {
            cookies.add(header);
        }
        // Save the cookies (I saved in SharedPrefrence), you save whereever you want to save
        preferencesHelper.putStringSet(PreferenceKey.PREF_KEY_COOKIES, cookies);
    }
    return originalResponse;
  }
}

Here we are saving all the cookies that you are getting in response.

Now You have cookies it's time to use it.

Wherever you want to use it, just get the cookies that you saved earlier

 HashSet<String> cookies = (HashSet<String>) preferencesHelper.getStringSet(
                        PreferenceKey.PREF_KEY_COOKIES);
        if (cookies != null) {
            for (String cookie: cookies) {  
                // Use this cookie whereever you wanna use.               
                Log.d("Cookie", cookie);                 
            }
        }

Best of luck 👍