J'essaie de récupérer les valeurs des cookies de la réponse de l'API pour maintenir la session principale en définissant la valeur du cookie sur le nouvel appel d'API au cas où l'APP serait fermée:
La réponse à l'appel API de 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;
}
Appel API
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
J'ai aussi essayé d'autres méthodes différentes, ils n'ont pas fonctionné pour moi. S'il vous plaît aider!
Le nom de l'en-tête est "Set-Cookie" et non pas "Cookie".
L'approche que vous prenez n'est pas appropriée. Si vous souhaitez enregistrer le cookie, vous pouvez créer un intercepteur, enregistrer le cookie et l'utiliser ultérieurement chaque fois que vous le souhaitez.
Voici ce que vous devez faire, commencez par créer un intercepteur
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;
}
}
Ici, nous enregistrons tous les cookies que vous recevez en réponse.
Maintenant que vous avez des cookies, il est temps de les utiliser.
Où que vous souhaitiez l'utiliser, récupérez simplement les cookies que vous avez enregistrés précédemment
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);
}
}
Bonne chance ????
Essayez response.headers (). Get ("Set-Cookie"))