当前位置: 代码迷 >> Android >> 关于httpclient的post请求,处理重定向的有关问题,有经验的大神
  详细解决方案

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

热度:63   发布时间:2016-04-28 06:22:56.0
关于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;
}
}

------解决方案--------------------
Get和Post都是封装好的。所以会自动重定向,
如果你用最原始的socket链接的,就不会重定向了。。
------解决方案--------------------
其实你只要用httpclient请求登陆就行了,重定向它会帮你处理好,session会自动放入HttpClient?对象里,接下来对该网站的请求,需要用同一个client对象
------解决方案--------------------
现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,
------解决方案--------------------
引用:
Quote: 引用:

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


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

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