使用HttpURLConnection发送post和get请求
1、http://blog.csdn.net/pandazxx/archive/2007/06/18/1657109.aspx
2、http://blog.csdn.net/pandazxx/archive/2007/06/20/1660008.aspx
但我们常常会碰到这样一种情况:
通过HttpURLConnection来模拟模拟用户登录Web服务器,服务器使用cookie进行用户认证。在模拟登录时,Post表单数据后可以正确登录(登陆成功时会response一个cookie,然后redirect到main page,不成功则redirect到login page),但是在使用HttpURLConnection再次连接服务器其他页面(或者即使是当前的response里是redirect的page)时,服务器都会认为是全新的一个Session。
解决方法有2步:
1. 调用HttpURLConnection (send post request to login page)的setInstanceFollowRedirects()方法,参数为false (这样不会去获取redirect page)
2. 获取HttpURLConnection send post request to login page的session id,然后在之后每一次的connection里都加上该session id
Example:
String sessionId =
"";
public
static
void
sendLoginRequest()
throws
IOException {
URL loginUrl =
new
URL(
"http://xxx"
);
HttpURLConnection connection = (HttpURLConnection) loginUrl.openConnection();
// Output to the connection. Default is
// false, set to true because post
// method must write something to the
// connection
//
设置是否向
connection
输出,因为这个是
post
请求,参数要放在
// http
正文内,因此需要设为
true
connection.setDoOutput(
true
);
// Read from the connection. Default is true.
connection.setDoInput(
true
);
// Set the post method. Default is GET
connection.setRequestMethod(
"POST"
);
// Post cannot use caches
// Post
请求不能使用缓存
connection.setUseCaches(
false
);
// This method takes effects to
// every instances of this class.
// URLConnection.setFollowRedirects
是
static
函数,作用于所有的
URLConnection
对象。
// connection.setFollowRedirects(true);
// This methods only
// takes effacts to this
// instance.
// URLConnection.setInstanceFollowRedirects
是成员函数,仅作用于当前函数
connection.setInstanceFollowRedirects(
false);
// Set the content type to urlencoded,
// because we will write
// some URL-encoded content to the
// connection. Settings above must be set before connect!
//
配置本次连接的
Content-type
,配置为
application/x-www-form-urlencoded
的
//
意思是正文是
urlencoded
编码过的
form
参数,下面我们可以看到我们对正文内容使用
URLEncoder.encode
//
进行编码
connection.setRequestProperty(
"Content-Type"
,
"application/x-www-form-urlencoded"
);
//
连接,从
postUrl.openConnection()
至此的配置必须要在
connect
之前完成,
//
要注意的是
connection.getOutputStream
会隐含的进行
connect
。
connection.connect();
DataOutputStream out =
new
DataOutputStream(connection
.getOutputStream());
// 要传的参数
String content = URLEncoder.encode(
"username", "UTF-8") + "="
+ URLEncoder.encode("XXX", "UTF-8");
content += "&" + URLEncoder.encode("password", "UTF-8") + "="
+ URLEncoder.encode("XXXX", "UTF-8");
// DataOutputStream.writeBytes
将字符串中的
16
位的
unicode
字符以
8
位的字符形式写道流里面
out.writeBytes(content);
out.flush();
out.close();
// flush and close
//Get Session ID
String key =
""
;
if (connection != null) {
for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++) {
if (key.equalsIgnoreCase("set-cookie")) {
sessionId = connection.getHeaderField(key);
sessionId = sessionId.substring(0, sessionId.indexOf(
";"));
}
}
}
connection.disconnect();
}
然后之后每一次connection都要加上这个session id:
URL url = new URL("http:......");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty("Cookie",this.sessionId);
connection.connect();