web-dev-qa-db-fra.com

Comment récupérer le cookie de la modification de réponse, okhttp?

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 :  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;
}

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!

4
Anurag Dhunna

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 ????

4
Rajan Maurya

Essayez response.headers (). Get ("Set-Cookie"))

0
yu wang