我正在使用Retrofit(1.7.1),它使用默认的OkHttp(2.1.0)客户端(我猜)在服务器上进行身份验证,并获得一些会话cookie来回复每个其他请求 .
我有一个CookieManager和一个设置“Cookie”标头的拦截器 .
拦截器将cookie构建为
cookieName + "=" + cookieValue + "; "
(我实际上使用的是StringWriter但结果却一样)
正确的 Headers 结果应该是:
Cookie: PHPSESSID=<my_php_sess_id>; session=<my_session_id>;
但
默认实现(我猜是OkHttp)添加另一个Cookie头,导致:
Cookie: PHPSESSID=<my_php_sess_id>; session=<my_session_id>;
Cookie: $Version="1"; PHPSESSID="<my_php_sess_id>";$Path="/";$Domain="<my_domain>"; session="<my_session_id>";$Path="/";$Domain="<my_domain>"
我可以找到第二个标头只用WireShark检查网络数据包,所有库日志只显示第一个 .
我认为这第二个 Headers 会导致一些麻烦:请注意cookie值周围的引号 .
有没有办法告诉OkHttp或Retrofit使用cookie的"plain"版本?
也许我误解了所有的Cookie / Client / Interceptor机制,但将Retrofit客户端设置为:
.setClient(new ApacheClient(new DefaultHttpClient()))
解决了这个问题 .
先感谢您
1 回答
我有一个类似的问题,由一个没有处理版本1 cookie(引用值)的网络服务器引起 . 我发现实现这一目标的唯一方法是迭代你的cookie商店:
但是......每次更改cookie时都需要调用它 . 我写了一个OkHttp拦截器,它正是这样做的:
这就是你启用它的方式:
我不使用Retrofit,但你应该用
.setClient(httpClient)
之类的东西替换你对.setClient(new ApacheClient(new DefaultHttpClient()))
的调用 .