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:
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!
You can add Cookie through retrofit using interceptor which is best solution for us to dynamically manage cookie in api request. I have tried with JavaNetCookieJar(cookieManager) Which is not Work in my case. So I use Interceptor for this which also work with Dependency Injection n(Dagger as well as Koin).
OkHttp is a pure HTTP/SPDY client responsible for any low-level network operations, caching, requests and responses manipulation. In contrast, Retrofit is a high-level REST abstraction build on top of OkHttp. Retrofit is strongly coupled with OkHttp and makes intensive use of it.
Solution 1: Sharing Default OkHttp Instance In order to make them share a single OkHttp instance, you can simply pass it explicitly on the builder: OkHttpClient okHttpClient = new OkHttpClient(); Retrofit retrofitApiV1 = new Retrofit. Builder() . baseUrl("https://futurestud.io/v1/") .
What is Retrofit. Retrofit is a REST Client for Java and Android allowing to retrieve and upload JSON (or other structured data) via a REST based You can configure which converters are used for the data serialization, example GSON for JSON.
List<String> Cookielist = response.headers().values("Set-Cookie");
String jsessionid = (Cookielist .get(0).split(";"))[0];
This worked for me, not the perfect solution,but it worked
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 👍
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With