有没有办法在改装请求上设置自定义cookie?
通过使用RequestInterceptor
或任何其他方式?
通过retrofit.RequestInterceptor
:
@Override public void intercept(RequestFacade request) { request.addHeader("Cookie", "cookiename=cookievalue"); }
您可以RequestInterceptor
按如下方式设置自定义:
String cookieKey = ... String cookieValue = ... RestAdapter adapter = new RestAdapter.Builder() .setRequestInterceptor(new RequestInterceptor() { @Override public void intercept(RequestFacade request) { // assuming `cookieKey` and `cookieValue` are not null request.addHeader("Cookie", cookieKey + "=" + cookieValue); } }) .setServer("http://...") .build(); YourService service = adapter.create(YourService.class);
要读取服务器设置的任何cookie,请附加如下自定义cookie管理器:
OkHttpClient client = new OkHttpClient(); CustomCookieManager manager = new CustomCookieManager(); client.setCookieHandler(manager); RestAdapter adapter = new RestAdapter.Builder() .setClient(new OkClient(client)) ... .build();
哪里CustomCookieManager
可能是这样的:
public class CustomCookieManager extends CookieManager { // The cookie key we're interested in. private final String SESSION_KEY = "session-key"; /** * Creates a new instance of this cookie manager accepting all cookies. */ public CustomCookieManager() { super.setCookiePolicy(CookiePolicy.ACCEPT_ALL); } @Override public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException { super.put(uri, responseHeaders); if (responseHeaders == null || responseHeaders.get(Constants.SET_COOKIE_KEY) == null) { // No cookies in this response, simply return from this method. return; } // Yes, we've found cookies, inspect them for the key we're looking for. for (String possibleSessionCookieValues : responseHeaders.get(Constants.SET_COOKIE_KEY)) { if (possibleSessionCookieValues != null) { for (String possibleSessionCookie : possibleSessionCookieValues.split(";")) { if (possibleSessionCookie.startsWith(SESSION_KEY) && possibleSessionCookie.contains("=")) { // We can safely get the index 1 of the array: we know it contains // a '=' meaning it has at least 2 values after splitting. String session = possibleSessionCookie.split("=")[1]; // store `session` somewhere return; } } } } } }