RETROFIT & AUTH COOKIE

Necesito saber cómo agregar un encabezado de cookie de autorización en retrofit. He visto consejos como usar el intercepter de la petición etc. Abajo está lo que estoy intentando, pero es esto correcto? En primer lugar ya necesitaba un RequestAdatper para obtener la id de sesión la primera vez. Esto sólo puede ser establecido por el constructor del adaptador de solicitud. Pero necesitaba hacer una solicitud sólo para obtener el id de sesión en primer lugar. ¿Necesito dos adaptadores de descanso uno para obtener el sessionId y otro después de haberlo obtenido. Lo que realmente necesito es un método en el adaptador para establecer la cookie después de que lo consiga, pero no parece ser tal un método. Esto se está poniendo incómodo. La pregunta es simple y bastante común. ¿Cómo establezco cookies de autorización en la actualización? No veo esto en FAQ o tutoriales.

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

Mantener una referencia al interceptor y tratarlo como un singleton como usted sería RestAdapter sí mismo.

 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(...); } } } 

Ahora, simplemente llame a setSessionId después de su llamada de autenticación. Todas las solicitudes posteriores incluirán el encabezado.

Usted puede conseguir las galletas como esto

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

Utilícelo para configurar el CookieHandler

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

Y luego utilizarlo de esta manera en su solicitud Interceptor

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

Paso 1. Analizar los encabezados de respuesta. Llame a este método dentro de su método de devolución de llamada en overriden success .

  /** * 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; } 

Paso 2. Escriba una clase estática o singleton para mantener las cookies y su instancia de RequestInterceptor. Dentro de RequestInterceptor interrumpir el método de intercepción para agregar las cookies a la cabecera.

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

De acuerdo con la respuesta de @ sbtgE, pero con algunas correcciones. CookieHandler.getDefault() puede ser null, así que utilizo CookieManager.

App build.gradle:

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

Configuración de Retrofit:

 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); 

Solución simple con lib. Compile com.squareup.okhttp3:okhttp-urlconnection:3.2.0 .

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

  • Subida de archivos con okhttp
  • Retrofit + okhttp: Recuperar GZIPInputStream
  • Retrofit2: Modificación del cuerpo de la petición en OkHttp Interceptor
  • Retrofit - Interceptar respuestas globalmente
  • OkHTTP y Picasso no funcionan juntos
  • Okhttp NoClassDefFoundError
  • Retrofit SocketTimeOutException al enviar datos multipartidarios o JSON en android
  • SocketTimeoutException en Retrofit
  • Cómo Retrofit con OKHttp utilizar datos de caché cuando está fuera de línea
  • Android Retrofit Se esperaba BEGIN_OBJECT pero era STRING en la línea 1 de la columna 1 path $
  • OkHttp cuerpo del poste del gzip
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.