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 ?????
- ¿Debemos usar el proveedor de seguridad de google con OkHttp?
- HTTPS no envía algunos encabezados de autenticación con Retrofit
- Android Okhttp llamadas asincrónicas
- ¿Cómo reintentar las solicitudes HTTP con OkHttp / Retrofit?
- Cómo manejar la paginación en retrofit
- Cómo configurar el caché Http cuando se utiliza Volley con OkHttp?
- Error retrofit.RetrofitError: java.io.EOFException para Android
- Android OkHttp cómo manejar ETag
- ¿Creación de directorio para caché OkHttp en Android?
- Volea Android MalformedURLException URL incorrecta
- ¿Cómo usar Retrofit y SimpleXML juntos para descargar y analizar un archivo XML de un sitio?
- Android Habilitar TLSv1.2 en OKHttp
- ProGuard no funciona con okhttp
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();
- Cómo eliminar Factor de gravedad de las lecturas del acelerómetro en el acelerómetro Android de 3 ejes
- Implementar método startForeground en Android