Java模拟表单提交的两种方式
最近在做项目时,需要将数据使用http的方式发送给其他客户,对常用的实现http请求的方法总结如下。
java中可以使用HttpClent与HttpURLConnection两种方式来实现发送htttp请求。本文中都是已post方式来介绍两种方式的使用
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。主要实现的功能包括1.实现了所有的http方法,包括get,post, put, head等,2.支持自动转向,3.支持HTTPS协议,4.支持代理服务器等。
HttpClient方式可以分为新老版本两种基本使用方法,先看下使用老版本实现的代码,如下所示:
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
public class HttpTests {
public void doPost(String url) throws Exception {
PostMethod httpPost =new PostMethod(url);
try
{
HttpClient httpclient = new HttpClient();
NameValuePair[] param = { new NameValuePair("username", "vip")};
httpPost.setRequestBody(param);
httpclient.executeMethod(httpPost);
}
catch(Exception ex)
{
throw ex;
}
finally
{
httpPost.releaseConnection();
}
}
}
新版本HttpClient中的实现方式如下:
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
public class HttpTests {
public void doPost(String url) throws Exception {
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("username", "vip"));
nvps.add(new BasicNameValuePair("password", "secret"));
try
{
HttpClient httpclient = new DefaultHttpClient();
//传入参数
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
httpclient.execute(httpPost);
httpclient.getConnectionManager().shutdown();
}
catch(Exception ex)
{
throw ex;
}
finally
{
httpPost.releaseConnection();
}
}
}
表单中的域用类NameValuePair来表示,该类的构造函数的第一参数表示域名,第二个参数表示该域的值。获取执行返回的结果可以使用方法getResponseBodyAsString() 。不管有没有成功最后都需要将连接释放。
HttpURLConnection其实是抽象类URLConnection的子类,每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。
HttpURLConnection实现方法如下:
Public void doPost(String url) throws Exception
{
HttpURLConnection conn = null;
URL url = null;
String result = "";
try
{
url = new java.net.URL(link);
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false); //POST请求无法使用缓存
conn.setRequestProperty("Content-type","application/x-java-serialized-object"); //设定传送的内容类型是可序列化的java对象
conn.setRequestMethod("POST");
conn.setConnectTimeout(10000);
conn.connect();
OutputStream outStrm = conn.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outStrm);
oos.writeObject(new String("我是测试数据"));
oos.flush();
oos.close();
InputStream urlStream = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlStream));
String s = "";
while ((s = reader.readLine()) != null)
{
result += s;
}
System.out.println(result);
reader.close();
urlStream.close();
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
Finally
{
If(conn != null)
{
conn.disconnect();
}
}
}
HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。