RETROFIT & AUTH COOKIE

Je dois savoir comment ajouter un en-tête de cookie d'autorisation lors de la rénovation. J'ai vu des conseils comme utiliser l'intercepteur de requêtes, etc. Voici ce que j'essaie, mais est-ce correct? Tout d'abord, j'avais déjà besoin d'un RequestAdatper pour obtenir l'identification de la session la première fois. Cela ne peut être défini que par le générateur de l'adaptateur de demande. Mais j'avais besoin de faire une demande pour obtenir l'ID de session en premier lieu. Ai-je besoin de deux adaptateurs de repos pour obtenir le sessionId et un autre après que je l'ai obtenu. Ce dont j'ai vraiment besoin, c'est une méthode sur l'adaptateur pour configurer le cookie après l'avoir, mais cela ne semble pas être une telle méthode. Cela devient gênant. La question est simple et assez commune. Comment puis-je configurer un cookie d'autorisation lors de la rénovation? Je ne vois pas cela dans les FAQ ou les tutoriels.

RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("Set-Cookie", "sessionId="+sessionIdentifier); } }; RestAdapter.Builder().setServer(serverURL)..setRequestIntercepter(requestIntercepter).build(); // but I don't have sessionId when this is first issued ????? 

  • Android: Comment puis-je afficher un toast à partir d'un thread exécuté dans un service distant?
  • Problème: passer de grandes données à la seconde activité
  • Décompresser le fichier dans les actifs d'Android
  • Comment garder une application Android en cours d'exécution indéfiniment?
  • Draw overlay (HUD) sur Android VideoView?
  • Connexion de liaison Android - Comment obtenir des dimensions de dimens.xml
  • Android: augmente AlertDialog à partir du thread d'arrière-plan
  • SecurityException: l'appelant uid XXXX est différent de l'uid de l'authentificateur
  • Tag: TextLayoutCache Texte: Cache Valeur supprimée
  • Java.io.IOException: échec de protocole SSL: échec dans la bibliothèque SSL, généralement une erreur de protocole
  • Comment afficher la fenêtre d'appel téléphonique lorsque vous cliquez sur le texte du numéro de téléphone
  • AdRequest.Builder ne peut pas être résolu à un type
  • 5 Solutions collect form web for “RETROFIT & AUTH COOKIE”

    Gardez une référence à l'intercepteur et RestAdapter -le comme un singleton comme si vous seriez RestAdapter lui-même.

     public class ApiHeaders implements RequestInterceptor { private String sessionId; public void setSessionId(String sessionId) { this.sessionId = sessionId; } public void clearSessionId() { sessionId = null; } @Override public void intercept(RequestFacade request) { if (sessionId != null) { request.setHeader(...); } } } 

    Maintenant, appelez simplement setSessionId après votre appel d'authentification. Toutes les demandes ultérieures incluront l'en-tête.

    Vous pouvez obtenir les cookies comme ça

      public class MyCookieManager extends CookieManager { @Override public void put(URI uri, Map<String, List<String>> stringListMap) throws IOException { super.put(uri, stringListMap); if (stringListMap != null && stringListMap.get("Set-Cookie") != null) for (String string : stringListMap.get("Set-Cookie")) { if (string.contains("JSESSIONID")) { Preference.getInstance().setSessionId(string); } } } } 

    Utilisez cette option pour configurer CookieHandler

      MyCookieManager myCookieManager = new MyCookieManager(); CookieHandler.setDefault(myCookieManager); 

    Et utilisez-le comme ceci dans votre demande Interceptor

      String sessionId = preference.getSessionId(); if (sessionId != null) requestFacade.addHeader(Cookie, sessionId); 

    Étape 1. En-têtes de réponse Parse. Appelez cette méthode dans votre rappel en mode de success surévalué.

      /** * Method extracts cookie string from headers * @param response with headers * @return cookie string if present or null */ private String getCookieString(Response response) { for (Header header : response.getHeaders()) { if (null!= header.getName() && header.getName().equals("Set-Cookie")) { return header.getValue(); } } return null; } 

    Étape 2. Écrivez une classe statique ou un singleton pour garder les cookies et votre instance RequestInterceptor. La méthode d'interception de substitution interne RequestInterceptor permet d'ajouter vos cookies à Header.

     public class RestAdapter { private static String cookies; public static String getCookies() { return cookies; } public static void setCookies(String cookies) { RestAdapter.cookies = cookies; } /** * Injects cookies to every request */ private static final RequestInterceptor COOKIES_REQUEST_INTERCEPTOR = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { if (null != cookies && cookies.length() > 0) { request.addHeader("Cookie", cookies); } } }; public static final RestInterface getService() { return new RestAdapter.Builder() .setEndpoint(Config.ENDPOINT) .setRequestInterceptor(COOKIES_REQUEST_INTERCEPTOR) .setConverter(new JacksonConverter()) .setLogLevel(RestAdapter.LogLevel.NONE) .build() .create(RestInterface.class); } } 

    Selon la réponse de @ sbtgE, mais avec quelques corrections. CookieHandler.getDefault() peut être nul, donc j'utilise CookieManager.

    Build.gradle de l'application:

     dependencies { ... compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1' } 

    Mise en place de rétrofit:

     service = new Retrofit.Builder() .baseUrl(/* your base URL */) .addConverterFactory(/* your favourite converter */) .client( new OkHttpClient.Builder() // this line is the important one: .cookieJar(new JavaNetCookieJar(new CookieManager())) .build()) .build() .create(YourInterface.class); 

    Solution simple utilisant lib. com.squareup.okhttp3:okhttp-urlconnection:3.2.0 .

    JavaNetCookieJar jncj = new JavaNetCookieJar(CookieHandler.getDefault()); OkHttpClient.Builder().cookieJar(jncj).build();

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.