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()这个函数里面才正式发送出去。

 

 

 

 

 

posted @ 2013-12-20 11:28  双天至尊  阅读(2263)  评论(0编辑  收藏  举报