RETROFIT & AUTH COOKIE

Мне нужно знать, как добавить заголовок cookie авторизации в модификацию. Я видел совет, как использовать запрос intercepter и т. Д. Ниже я пытаюсь, но это правильно? Прежде всего, мне уже нужен RequestAdatper, чтобы получить идентификатор сеанса в первый раз. Это может быть задано только разработчиком адаптера запроса. Но мне нужно было сделать запрос, чтобы сначала получить идентификатор сеанса. Нужно ли мне два адаптера для отдыха, чтобы получить sessionId и еще один после того, как я его получил. То, что мне действительно нужно, – это метод адаптера для установки cookie после его получения, но он не является таким методом. Это становится неудобно. Вопрос прост и достаточно распространен. Как установить cookie авторизации в модификации? Я не вижу этого в FAQ или руководства.

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

Solutions Collecting From Web of "RETROFIT & AUTH COOKIE"

Держите ссылку на перехватчик и относитесь к нему как к RestAdapter самому RestAdapter .

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

Теперь просто вызовите setSessionId после вашего запроса на аутентификацию. Все последующие запросы будут включать заголовок.

Вы можете получить такие куки

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

Используйте это, чтобы установить CookieHandler

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

А затем использовать его так, как в вашем запросе Interceptor

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

Шаг 1. Разбор ответов. Вызовите этот метод в своем обратном вызове с помощью метода 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; } 

Шаг 2. Напишите некоторый статический класс или синглтон, чтобы сохранить файлы cookie и экземпляр RequestInterceptor. Внутри RequestInterceptor переопределите метод перехвата, чтобы добавить ваши файлы cookie в заголовок.

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

Согласно ответу @ sbtgE, но с некоторыми исправлениями. CookieHandler.getDefault() может быть нулевым, поэтому я использую CookieManager.

App's build.gradle:

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

Настройка дооснащения:

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

Простое решение с использованием lib. com.squareup.okhttp3:okhttp-urlconnection:3.2.0 .

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