当前位置: 首页 > 知识库问答 >
问题:

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

夏令秋
2023-03-14

我在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个答案

云俊名
2023-03-14

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

您可以阅读更多信息:

在OkHttp中执行Cookie

在OkHttp 2中做cookie

AOSP问题75182

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

 类似资料:
  • 在网络请求中使用和有什么好处。我见过许多使用的示例,但我想明白为什么。 示例情形: 为每个工作单元创建一个新线程。将使用线程池 但这种争论对应用程序有什么影响呢?还有哪些方面?

  • 我正在从事一个android项目,其中我计划用OKHTTP客户端替换Apache httpclient实现。我想知道如何创建一个全局客户端,该客户端可用于使用客户端多线程的不同活动和服务中的网络请求。我应该创建OKHTTPClient的单例对象并在我的代码中重用它吗? 此外,我应该在哪里添加cookie到请求中,在客户端的全局定义中,以便我所有的请求都有cookie可用,或者在单个活动或服务中形成

  • 问题内容: 在大多数语言(如c ++)中,传递数组会导致通过引用隐式传递它,因此对函数中传递的数组进行的任何更改都将导致更改原始数组。我正在学习Golang,在Alan AA Donovan和Brian W. Kernighan撰写的《 Go编程语言》一书中,它的行为不同于其他语言-不会隐式地通过引用传递数组。 这让我有些困惑-这是否意味着在没有引用的情况下传递数组不应该修改数组本身?让我说明一下

  • OKHTTP在某种程度上支持并发请求API吗? 如果没有,最好的实现方法是什么?

  • 我有以下情况: 我有一个使用 JMX 公开一些方法的应用程序,位于服务器上。目前,用户可以使用jconsole通过命令行连接到此内容。目前没有访问限制。 用户将登录到机器并以活动目录的形式存储访问权限。 我希望将身份验证和授权添加到 jmx 流程中,以便当用户在命令行中键入时: 它将检查他们的AD用户组,并确定他们是否有权读取或读写托管资源。 我有一个检索AD组的解决方案,但不是如何将其传递给JM

  • 我在我们的一个应用程序中使用改造和okhttp。 对于Retrofit的默认行为,我真的找不到一个好的解释。 如果Okhttp在类路径上,它将被自动使用。但是据我所知,默认的HttpResponseCache是null。 我是否需要使用Retrofit和Okhttp显式启用缓存?