我在OkHttp和Cookies管理方面遇到问题。
我正在使用一个定制的OkHttpClient和一个CookieManager创建一个改装客户端。
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());
在这个请求的响应头中,我有这样一个:
设置Cookie:auth=someauthkey468tyyuy;路径=/;域=。我的网站。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 handler和OkHttp一起使用,或者我正在尝试做一些不可能的事情(除非手动添加标头),或者我只是做得不好,在某个地方失败了?
谢谢你的帮助!
我认为您设置的一切都正确。Android中的CookieManager存在一些问题。我花了很多时间试图使其正常工作。因此,我通过拦截器实现了cookie管理的小型自定义实现。
您可以阅读更多信息:
在OkHttp中执行Cookie
在OkHttp 2中做cookie
AOSP问题75182
你也可以在SO上找到许多相关的帖子