Code Bye

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

 

最近在做一个学校查课表的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;
	}
}

25分
Get和Post都是封装好的。所以会自动重定向,
如果你用最原始的socket链接的,就不会重定向了。。
引用 1 楼 AA5279AA 的回复:

Get和Post都是封装好的。所以会自动重定向,
如果你用最原始的socket链接的,就不会重定向了。。

因为要模拟登陆,,纯粹用socket来处理,,,会感觉好无力啊


25分
其实你只要用httpclient请求登陆就行了,重定向它会帮你处理好,session会自动放入HttpClient?对象里,接下来对该网站的请求,需要用同一个client对象
引用 3 楼 qazxsw1989118 的回复:

其实你只要用httpclient请求登陆就行了,重定向它会帮你处理好,session会自动放入HttpClient?对象里,接下来对该网站的请求,需要用同一个client对象

我一开始是那样让他请求登陆的,,不过好像没登上去,,返回的结果不是预期的,没有登陆成功,这个人的问题跟我的也一样,http://bbs.csdn.net/topics/390039402?page=1#post-397057246

不过我现在在想登录失败,是不是我登陆的有问题


25分
现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,
引用 5 楼 heaimnmn 的回复:

现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,

问题解决了,,还是我一直担心的问题,,由于自己的知识问题看不到那个高度,或者由于误导所以走了错路,才导致自己解决不了的问题,,,如果问题的本身就有问题,,那么这个问题就没有意义了,,,

解决问题了很高兴,,,进来的每个人给十分,,,快来拿呀~~~~


25分
引用 6 楼 aishang5wpj 的回复:
Quote: 引用 5 楼 heaimnmn 的回复:

现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,

问题解决了,,还是我一直担心的问题,,由于自己的知识问题看不到那个高度,或者由于误导所以走了错路,才导致自己解决不了的问题,,,如果问题的本身就有问题,,那么这个问题就没有意义了,,,

解决问题了很高兴,,,进来的每个人给十分,,,快来拿呀~~~~

LZ 我和你一样的情况啊,我们做的都是正方教务系统的,基本参数和你的一样,一开始因为那段万恶的安全码问题,我需要获取到他,作为重定向后提交参数的地址,和你一样普通java项目中可以看到有重定向的过程,但是在android项目中就没有了.因为登录需要用到账号密码,还有那个验证码,我是想从验证码那里获取到验证码后根据这个安全码加上/default2.aspx地址作为提交参数的地址.就是没有重定向,导致我一直没有成功,后来看到你这个使用了安全码的地址,我直接把他固定下来,测试了,竟然成功了.
另外,我不明白的就是你说的那段安全码的问题,他是怎么产生的,我每次打开他的主页,然后他就会重定向,后面加了一大段安全码,但是那个安全码貌似只是有长度作用,没有什么特殊意义,我随便修改了那段安全码照样能登录,
引用 6 楼 aishang5wpj 的回复:
Quote: 引用 5 楼 heaimnmn 的回复:

现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,

问题解决了,,还是我一直担心的问题,,由于自己的知识问题看不到那个高度,或者由于误导所以走了错路,才导致自己解决不了的问题,,,如果问题的本身就有问题,,那么这个问题就没有意义了,,,

解决问题了很高兴,,,进来的每个人给十分,,,快来拿呀~~~~

怎么解决的???

同样的问题  求助,楼主还记得这个问题不?
楼主还在么,我现在的毕设,跟你差不多,以为内我看到你们的学校的网站和我们学校的是一个公司的。。。现在求救啊,学长,看到一定要尽快回复啊,小弟快纠结死了,卡在那动不了了!
引用 8 楼 act262 的回复:

LZ 我和你一样的情况啊,我们做的都是正方教务系统的,基本参数和你的一样,一开始因为那段万恶的安全码问题,我需要获取到他,作为重定向后提交参数的地址,和你一样普通java项目中可以看到有重定向的过程,但是在android项目中就没有了.因为登录需要用到账号密码,还有那个验证码,我是想从验证码那里获取到验证码后根据这个安全码加上/default2.aspx地址作为提交参数的地址.就是没有重定向,导致我一直没有成功,后来看到你这个使用了安全码的地址,我直接把他固定下来,测试了,竟然成功了.
另外,我不明白的就是你说的那段安全码的问题,他是怎么产生的,我每次打开他的主页,然后他就会重定向,后面加了一大段安全码,但是那个安全码貌似只是有长度作用,没有什么特殊意义,我随便修改了那段安全码照样能登录,

学长你还在吗,我也遇到登陆地额问题,想请教一下啊,看到一定要回复小弟啊


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于httpclient的post请求,处理重定向的问题,,有经验的大神请指教啊