关于httpclient的post请求,处理重定向的问题,,有经验的大神请指教啊

啤丶酒 2014-03-28 10:01:28
最近在做一个学校查课表的apk,其中需要用httpclient模拟一次校网登陆的请求,下面的这个截图是在电脑上用ie浏览器登陆时,在httpwathc里面查看到的,说明登陆的时候中间是有一次重定向的处理的。

昨天查资料的时候,看到别人说get请求会自动处理重定向,要在参数里面设置一下才能进制httpclient自动处理重定向,但是我用的是post请求,因为要传递参数,所以昨天我就在这个帖子里面问post请求有没有类似的方法来禁止httpclient来自动处理重定向。

但是早上我查资料的时候,发现用post和put方法访问时,在httpclient里面是无法完成自动重定向的,所以就不需要考虑怎样去禁止自动处理重定向了。

现在我的问题是什么呢,重定向访问的响应消息的状态码应该是302,对吧,从我这个截图里面也可以看到,第一次是302,浏览器重定向访问,第二次才是200,而且第一次是post请求,第二次是get请求,,但是我在代码里面用post访问时,它的状态码是200,我就很纳闷。

可能有人问我传递的参数有没有问题,下面第二张是我用httpwatch查看的浏览器传参的截图,我在代码里面也是一样的,应该没问题。

最下面是我的代码,,,因为是自学,网上资料也很少,很乱,,所以感觉很头疼,,希望大神能指导指导。

十分感谢!!





public class MainActivity extends Activity {

final String HUPE_LOGIN = "http://jwgl.hbpu.edu.cn/(m2html45co445eunb4vp30fv)/default2.aspx";

// url的前缀部分,中间的安全验证部分,以及最后的包含学生个人信息的供get方法访问的参数部分,在、三者合起来才是最后的url
String urlPrefix = "http://jwgl.hbpu.edu.cn";
String urlFromHead = ""; // "/(m2html45co445eunb4vp30fv)/xxx"格式,前面有斜杠,后面无斜杠
String urlParsered = "";// 前面无斜杠,在前面要记得加"/"

HttpClient client;
HttpResponse response;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

client = new DefaultHttpClient();
}

// 这是和按钮绑定的一个方法,apk运行后点击界面上的按钮,就可以开始模拟一次登陆了
public void startTest(View v) {

new Thread() {
public void run() {
printText();
};
}.start();
}

public void printText() {
if (login()) {
String redirectLocation = getRedirectLocation();
if (redirectLocation != null) {
System.out.println(getText(redirectLocation));
}
}
}

// 模拟登陆
private boolean login() {
HttpPost post = new HttpPost(HUPE_LOGIN); // 用键值对存放参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("TextBox1", "201140430124"));
params.add(new BasicNameValuePair("TextBox2", "201140430124"));

try {
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
// 发送post请求
response = client.execute(post);

} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
// 终止此次post访问
post.abort();
}
return true;
}

// 获取包含重定向信息的头字段
private String getRedirectLocation() {
// 用httpwatch查看时,可以看到post请求的响应消息状态吗是302,里面有location字段
// 但是在模拟器上debug时,响应消息的状态行的状态吗是200,而且里面没有location字段
Header locationHeader = response.getFirstHeader("Location");
if (locationHeader == null) {
return null;
}
return locationHeader.getValue();
}

/*
* @param redirectLocation 重定向的地址
*
* @return 根据重定向得到的网页内容
*/
private String getText(String redirectLocation) {
//
HttpGet httpget = new HttpGet(redirectLocation);
// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = "";
try {
responseBody = client.execute(httpget, responseHandler);
} catch (Exception e) {
e.printStackTrace();
responseBody = null;
} finally {
httpget.abort();
client.getConnectionManager().shutdown();
}
return responseBody;
}
}
...全文
9463 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
啤丶酒 2016-04-19
  • 打赏
  • 举报
回复
这个问题提出了后,很多学弟给我私信问我这个问题最后怎么解决的,现在这里统一答复下。 说来惭愧,这个项目我后来是放弃了的,感觉当初还是基础不扎实,加上经验受限,所以后来就没有继续做下去了。 理想很丰满,现实很残酷。 当然学弟们也不要轻言放弃,所谓青出于蓝而胜于蓝,学长还是非常支持你们的,希望你们比学长强。 有两点需要说明的是,很多人问我为什么收到了状态码200,但是还是登陆失败。我想说的是,状态码200只表示这次http请求发送成功,并不一定就是登陆成功,你输入错误的账号和密码,只要请求成功,都能收到200的状态码,希望学弟们能明白这两者之间的差别。 另外你们可能要处理cookies的问题,登陆成功时服务器应该会返回一些cookies信息,你们需要从响应头里面取出来,并且下次请求的时候在请求头里面带出去,至于具体代码怎么写,你们可以baidu。 当初做这个项目的时候,主要是想练练手熟悉下安卓,特别是网络请求这一块。如果有学弟也只是想跟我一样练练网络请求这一块话,你们可以去搜一下网络上的很多api开放平台,你们可以用他们的api做一些简单实用的小项目,比如天气查询、快递查询、祝福短信、恋爱资讯之类的。 这里推荐两个百度api 聚合数据。 大概情况就是这样了。
WarmSword 2015-12-12
  • 打赏
  • 举报
回复
问题咋解决的呢 我用python在做一个功能类似的脚本 发现能返回登录后的一些用户信息 但是connection一直是close 而不是keep-alive 我怀疑是重定向的问题 楼主你怎么看
Hello、MrTree 2015-10-16
  • 打赏
  • 举报
回复
求解释是什么原因??
爆米花机枪手 2015-04-01
  • 打赏
  • 举报
回复
引用 8 楼 act262 的回复:
LZ 我和你一样的情况啊,我们做的都是正方教务系统的,基本参数和你的一样,一开始因为那段万恶的安全码问题,我需要获取到他,作为重定向后提交参数的地址,和你一样普通java项目中可以看到有重定向的过程,但是在android项目中就没有了.因为登录需要用到账号密码,还有那个验证码,我是想从验证码那里获取到验证码后根据这个安全码加上/default2.aspx地址作为提交参数的地址.就是没有重定向,导致我一直没有成功,后来看到你这个使用了安全码的地址,我直接把他固定下来,测试了,竟然成功了. 另外,我不明白的就是你说的那段安全码的问题,他是怎么产生的,我每次打开他的主页,然后他就会重定向,后面加了一大段安全码,但是那个安全码貌似只是有长度作用,没有什么特殊意义,我随便修改了那段安全码照样能登录,
学长你还在吗,我也遇到登陆地额问题,想请教一下啊,看到一定要回复小弟啊
爆米花机枪手 2015-04-01
  • 打赏
  • 举报
回复
楼主还在么,我现在的毕设,跟你差不多,以为内我看到你们的学校的网站和我们学校的是一个公司的。。。现在求救啊,学长,看到一定要尽快回复啊,小弟快纠结死了,卡在那动不了了!!!
_Jaren 2015-03-20
  • 打赏
  • 举报
回复
同样的问题 求助,楼主还记得这个问题不?
田小瘦 2014-12-04
  • 打赏
  • 举报
回复
引用 6 楼 aishang5wpj 的回复:
[quote=引用 5 楼 heaimnmn 的回复:] 现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,
问题解决了,,还是我一直担心的问题,,由于自己的知识问题看不到那个高度,或者由于误导所以走了错路,才导致自己解决不了的问题,,,如果问题的本身就有问题,,那么这个问题就没有意义了,,, 解决问题了很高兴,,,进来的每个人给十分,,,快来拿呀~~~~[/quote] 怎么解决的???
act262 2014-04-29
  • 打赏
  • 举报
回复
LZ 我和你一样的情况啊,我们做的都是正方教务系统的,基本参数和你的一样,一开始因为那段万恶的安全码问题,我需要获取到他,作为重定向后提交参数的地址,和你一样普通java项目中可以看到有重定向的过程,但是在android项目中就没有了.因为登录需要用到账号密码,还有那个验证码,我是想从验证码那里获取到验证码后根据这个安全码加上/default2.aspx地址作为提交参数的地址.就是没有重定向,导致我一直没有成功,后来看到你这个使用了安全码的地址,我直接把他固定下来,测试了,竟然成功了. 另外,我不明白的就是你说的那段安全码的问题,他是怎么产生的,我每次打开他的主页,然后他就会重定向,后面加了一大段安全码,但是那个安全码貌似只是有长度作用,没有什么特殊意义,我随便修改了那段安全码照样能登录,
teemai 2014-03-30
  • 打赏
  • 举报
回复
引用 6 楼 aishang5wpj 的回复:
[quote=引用 5 楼 heaimnmn 的回复:] 现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,
问题解决了,,还是我一直担心的问题,,由于自己的知识问题看不到那个高度,或者由于误导所以走了错路,才导致自己解决不了的问题,,,如果问题的本身就有问题,,那么这个问题就没有意义了,,, 解决问题了很高兴,,,进来的每个人给十分,,,快来拿呀~~~~[/quote]
啤丶酒 2014-03-29
  • 打赏
  • 举报
回复
引用 5 楼 heaimnmn 的回复:
现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,
问题解决了,,还是我一直担心的问题,,由于自己的知识问题看不到那个高度,或者由于误导所以走了错路,才导致自己解决不了的问题,,,如果问题的本身就有问题,,那么这个问题就没有意义了,,, 解决问题了很高兴,,,进来的每个人给十分,,,快来拿呀~~~~
哎,真难 2014-03-28
  • 打赏
  • 举报
回复
现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,
啤丶酒 2014-03-28
  • 打赏
  • 举报
回复
引用 3 楼 qazxsw1989118 的回复:
其实你只要用httpclient请求登陆就行了,重定向它会帮你处理好,session会自动放入HttpClient 对象里,接下来对该网站的请求,需要用同一个client对象
我一开始是那样让他请求登陆的,,不过好像没登上去,,返回的结果不是预期的,没有登陆成功,这个人的问题跟我的也一样,http://bbs.csdn.net/topics/390039402?page=1#post-397057246 不过我现在在想登录失败,是不是我登陆的有问题
qazxsw1989118 2014-03-28
  • 打赏
  • 举报
回复
其实你只要用httpclient请求登陆就行了,重定向它会帮你处理好,session会自动放入HttpClient 对象里,接下来对该网站的请求,需要用同一个client对象
啤丶酒 2014-03-28
  • 打赏
  • 举报
回复
引用 1 楼 AA5279AA 的回复:
Get和Post都是封装好的。所以会自动重定向, 如果你用最原始的socket链接的,就不会重定向了。。
因为要模拟登陆,,纯粹用socket来处理,,,会感觉好无力啊
失落夏天 版主 2014-03-28
  • 打赏
  • 举报
回复
Get和Post都是封装好的。所以会自动重定向, 如果你用最原始的socket链接的,就不会重定向了。。

80,363

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧