Android:如何在HTTP Post请求中使用Cookies

3

我在尝试与服务器进行身份验证时遇到了一些问题。

当我手动尝试通过Google插件(如Postman)设置cookie时,它可以正常工作,但是当通过Android设备或模拟器进行设置时却不能正常工作。

以下是我处理这部分的代码:

String url = "www.thisismyendpoint.com";
String ci_session = "ci_session=token";

CookieStore cookieStore = new BasicCookieStore();
BasicClientCookie stdCookie = new BasicClientCookie("Cookie",ci_session);
cookieStore.addCookie(stdCookie);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();

localContext.setAttribute(ClientContext.COOKIE_STORE,
        cookieStore);
HttpPost httppost = new HttpPost(url);

HttpResponse response = httpClient.execute(httppost, localContext); 

这是我的日志记录中的响应:
02-19 16:43:47.149: D/response(27539): response: <div style="border:1px solid             #990000;padding-left:20px;margin:0 0 10px 0;">
02-19 16:43:47.149: D/response(27539): <h4>A PHP Error was encountered</h4>
02-19 16:43:47.149: D/response(27539): <p>Severity: Notice</p>
02-19 16:43:47.149: D/response(27539): <p>Message: Undefined index: ci_session</p>
02-19 16:43:47.149: D/response(27539): <p>Filename: controllers/test.php</p>
02-19 16:43:47.149: D/response(27539): <p>Line Number: 28</p>
02-19 16:43:47.149: D/response(27539): </div>

我是否做错了什么?我试过将ci_session设置到请求头中,但同样没有起作用。请给予建议。谢谢!


看起来 PHP 脚本存在问题。该消息表明,您用于捕获从 Java 发送的 "ci_session" 参数的数组中不存在 "ci_session"。 - Lobo
但当我模拟浏览器发送相同的请求时,它可以工作。所以我想知道在Android中是否有什么我做错了。 - kenwjj
2个回答

2
我遇到了类似的问题。你不应该为每个新请求创建一个新的 DefaultHttpClient。相反,使用一个静态的单例并将其用于所有 Http 请求需求。

2

您确定 cookie 已经正确设置了吗?
在我的情况下,我使用 HttpGet 并手动设置 cookie:

HttpGet httpGet = new HttpGet(url);
httpGet.addHeader("Cookie", cookie);

Cookie 存储在 sharedPreferences 中。我认为对于 HttpPost 来说应该是同样适用的。


是的,我搞定了。真不敢相信,有时候最简单的解决方案都会让我们失去思路。 - kenwjj
请问您能否发布您的整个解决方案? - Dimitri
你需要理解什么?httpGet是一个新初始化的对象,cookie是你在安全位置保存的字符串。要使用URL(也是一个字符串)调用网站,你必须调用new DefaultHttpClient().execute(httpGet),但在我看来这太离题了。 - Philipp Kuntschik
如果有多个cookie怎么办?@PhilippKuntschik - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接