AndroidHttpClient期望响应代码302,但接收到200
我正在尝试使用Android应用程序登录https网站。如果登录成功,网站将返回302响应代码;如果登录失败,网站将返回200响应代码。我已经研究了如何使用AndroidHttpClient并查看了一些示例,但是我还没有看到我的代码和他们的代码之间的任何差异。无论我发送给网站的用户名和密码是什么,我都会得到200的回复码——即使组合正确。由于网站使用安全http,我是否必须做一些特殊的事情?这是我的密码。我真的很感谢你的帮助AndroidHttpClient期望响应代码302,但接收到200,android,http,Android,Http,我正在尝试使用Android应用程序登录https网站。如果登录成功,网站将返回302响应代码;如果登录失败,网站将返回200响应代码。我已经研究了如何使用AndroidHttpClient并查看了一些示例,但是我还没有看到我的代码和他们的代码之间的任何差异。无论我发送给网站的用户名和密码是什么,我都会得到200的回复码——即使组合正确。由于网站使用安全http,我是否必须做一些特殊的事情?这是我的密码。我真的很感谢你的帮助 public void login(String url, Strin
public void login(String url, String username, String password){
CookieStore cookieStore;
HttpContext httpContext;
HttpGet httpGet;
HttpResponse httpResponse;
HttpPost post;
AndroidHttpClient httpClient;
cookieStore = new BasicCookieStore();
httpContext = new BasicHttpContext();
httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
httpClient = AndroidHttpClient.newInstance("Android");
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", username));
params.add(new BasicNameValuePair("pass", password));
params.add(new BasicNameValuePair("form_id", "user_login"));
httpGet = new HttpGet(url);
post = new HttpPost(url);
try {
post.setEntity(new UrlEncodedFormEntity(list, HTTP.UTF_8));
httpResponse = httpClient.execute(httpGet, httpContext);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.i("My App", httpResponse.getStatusLine().getStatusCode());
}
公共无效登录(字符串url、字符串用户名、字符串密码){
CookieStore CookieStore;
HttpContext HttpContext;
HttpGet-HttpGet;
HttpResponse HttpResponse;
HttpPost;
AndroidHttpClient httpClient;
cookieStore=新的BasicCookieStore();
httpContext=新的BasicHttpContext();
setAttribute(ClientContext.COOKIE_存储,cookieStore);
httpClient=AndroidHttpClient.newInstance(“Android”);
List params=new ArrayList();
添加(新的BasicNameValuePair(“名称”,用户名));
参数add(新的BasicNameValuePair(“pass”,password));
添加(新的BasicNameValuePair(“表单id”、“用户登录”);
httpGet=新的httpGet(url);
post=新的HttpPost(url);
试一试{
setEntity(新的UrlEncodedFormEntity(列表,HTTP.UTF_8));
httpResponse=httpClient.execute(httpGet,httpContext);
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
Log.i(“我的应用程序”,httpResponse.getStatusLine().getStatusCode());
}
您应该使用POST而不是GET,因为GET将自动处理重定向,但是:
如果302状态代码是响应GET或HEAD以外的请求而接收的,则除非用户能够确认,否则用户代理不得自动重定向请求,因为这可能会改变发出请求的条件
参考:
编辑:在进一步检查时,看起来KVP被传递到HttpPost
中,但是HttpGet
被用于请求,因此用户名/密码根本不会被传递到服务器
有时,过度思考确实会使人朝着正确的方向前进,尽管HTTP连接成功时响应代码为200,但它不会检查您是否登录。因此,如果您的连接成功,它将只返回200。这个特定的站点是否会重定向到登录页面,而不是返回302?(相关:)@Lalit Poptani你知道为什么我使用javax.net.ssl.HttpsURLConnection时它会给我一个响应代码302吗?另外,我很确定当我收到200条回复时,我不会得到一个cookie来登录。这就像它只是忽略登录请求而只是调出登录页面一样。@mootinator我实际上是在将登录请求发送到登录页面,因此它不会重定向。如果您在输入错误凭据时被重定向回登录页面,而不是得到错误页面,这是一样的,不是droid或java开发人员,但我是这样做的:
httpGet=newhttpget(url)
和httpResponse=httpClient.execute(httpGet,httpContext)
(并且不要在请求中使用post
变量。)哦,哇,你说得对!哈哈,我在网上看了这么多的例子,我一定是把不同的部分混在一起了,用get而不是post。非常感谢你!