java模拟浏览器请求
通常有两种方式
方式一:用jdk原始提供的类
jdk提供的比较单一基础。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class PostForm {
public static void main(String []args) {
String url = "http://localhost:8080/test/login.do";
String params = "username=xxx&password=xxx";
System.out.println(getSoundCode(url,params,"utf-8"));
}
/**
* 获取网页内容
* @param url 网址
* @param encoding 编码方式
* @param params 表单参数
* @return 网页内容
*/
public static String getSoundCode(String url, String params ,String encoding) {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
OutputStream os = connection.getOutputStream();
os.write(params.getBytes());
os.close();
InputStream input = connection.getInputStream();
InputStreamReader read = new InputStreamReader(input, encoding);
BufferedReader reader = new BufferedReader(read);
String line;
StringBuilder result = new StringBuilder();
while ((line = reader.readLine()) != null) {
result.append(line+"\n") ;
}
reader.close();
read.close();
input.close();
return result.toString();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
}
方式二:用Apache提供的jar包
所需最小jar下载地址:
http://yun.baidu.com/share/link?shareid=1795594075&uk=170295677
它为开发人员提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,
Commons-HttpClient项目就是专门设计并用来简化HTTP客户端与服务器进行各种通讯编程实现的
它能实现常规的HTTP客户端程序(也就是浏览器程序)的各种功能。
重点:可以模拟浏览器保持回话,这样有些需要登录才能操作的就可以用这个。例如一个自动回帖功能,或者网络爬虫。
简单例子如下:
import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
public class Test {
/**
* 得到一个表单提交对象
* @param url 提交的网址
* @param parms 提交表单的内容
* @return 表单提交对象
*/
public static PostMethod getPostMethod(String url,String parms) {
PostMethod rs = new PostMethod(url);
rs.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gb2312");
if(parms == null) {
return rs;
}
String [] values = parms.split("&");
NameValuePair [] pairs = new NameValuePair[values.length];
String [] temp;
for(int i=0;i<values.length;i++) {
temp = values[i].split("=");
pairs[i] = new NameValuePair(temp[0],temp[1]);
}
rs.setRequestBody(pairs);
return rs;
}
/**
* 获取表单提交返回结果
* @param client 相当于浏览器对象
* @param post 提交对象
* @return 返回的内容
* @throws IOException
*/
public static String getContent(HttpClient client,PostMethod post) throws IOException {
String content = null;
client.executeMethod(post);
if (post.getStatusCode() == HttpStatus.SC_OK) {
content = post.getResponseBodyAsString();
}
else {
throw new RuntimeException("获取网络内容出错!");
}
post.releaseConnection();
return content;
}
public static void main(String[] args) throws Exception {
HttpClient client = new HttpClient();
String url = "http://172.0.0.1:8080/test//login.do";
String parms = "action=login&username=xxx&password=xxx";
PostMethod post = getPostMethod(url,parms);
System.out.println(getContent(client,post));
post = getPostMethod("http://172.0.0.1:8080/test/test.do",null);
System.out.println(getContent(client,post));
}
}