提问者:小点点

将CookieHandler与OkHttp结合使用并对其进行改进2


我在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一起使用,或者我正在尝试做一些不可能的事情(除非手动添加标头),或者我只是做得不好,在某个地方失败了?

谢谢你的帮助!


共1个答案

匿名用户

我认为您设置的一切都正确。Android中的CookieManager存在一些问题。我花了很多时间试图使其正常工作。因此,我通过拦截器实现了cookie管理的小型自定义实现。

您可以阅读更多信息:

在OkHttp中执行Cookie

在OkHttp 2中做cookie

AOSP问题75182

你也可以在SO上找到许多相关的帖子