我在使用OkHttp和Cookies管理方面遇到了一些麻烦。
我正在创建一个带有CookieManager的自定义OkHttpClient的Retrofit客户端。
final OkHttpClient okHttpClient = new OkHttpClient();
mCookieHandler = new CookieManager();
okHttpClient.setCookieHandler(mCookieHandler);
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.mysite.com/")
.client(okHttpClient)
.addConverter(String.class, new StringConverter())
.build();
接着,我发出了身份验证请求,如果我的登录信息正确,服务器会发回一个身份验证cookie:
interface AuthService {
@POST
@FormUrlEncoded
Call<String> auth(@Url String url,
@Field("login") String login,
@Field("password") String password);
}
使用方法如下:
mAuthService = retrofit.create(AuthService.class);
mAuthService.auth("https://auth.mysite.com/some/path", "mylogin", "mypassword")
.enqueue(new AuthCallback());
在这个请求的响应头中,我有一个像这样的东西:
Set-Cookie: auth=someauthkey468TYUIYTYUY; path=/; domain=.mysite.com
请求完成后,如果我查看cookie处理程序,cookie存储映射中会有一个条目:
key = http://auth.mysite.com
value = a list of cookie with only auth=someauthkey468TYUIYTYUY
目前一切都很顺利。我的认证 cookie 已经完美地存储在 cookie 处理程序中。
但现在,我想使用另一个服务执行请求以下载一些数据:
interface UserService {
@GET("user") // remember that the base url of retrofit is http://api.mysite.com/
Call<String> getMyCurrentInfo();
}
retrofit.create(UserService.class).getMyCurrentInfo().execute();
在这里,我期望OkHttp将之前接收到的存储在cookie处理程序中的cookie添加到此请求中,但是OkHttp没有添加任何标头! cookie从未发送回服务器。 :(
Cookie处理程序和OkHttp是否存在问题,还是我试图做一些不可能的事情(除非手动添加标头),或者我只是做得不好而失败了?
感谢您的帮助!