java用HttpURLConnection模拟post提交数据

23 篇文章 0 订阅

java.net.HttpURLConnection可以模拟http的post、get提交数据

这个测试类:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class testPost
{
     public static void main(String[] args) throws UnsupportedEncodingException
     {
    long bc = System.currentTimeMillis();
    for(int i=0;i<100;i++)
    {
       long b = System.currentTimeMillis();
       String str = "<xml><test>aa 1_ 1 </test><name>姓名</name></xml>"+i*100;
       str = URLEncoder.encode(str,"utf-8");
       testPost.sendRequest(str);
       long c = System.currentTimeMillis();
       System.out.println("第"+i+"此" + "耗时:" + (c-b));
    }
    long cc = System.currentTimeMillis();
    System.out.println("耗时:" + (bc-cc));

   
   
     }
    
     public static String sendRequest(String strXml)
     {
         StringBuffer buffer = null;
    HttpURLConnection c = null;
         try
         {
        System.out.println("go!");
             URL url=new URL("http://localhost:8080/xfirews/servlet/getPhpServlet");
             c=(HttpURLConnection)url.openConnection();
             c.setRequestMethod("POST");
             c.setRequestProperty("content-type", "text/html");
             c.setRequestProperty("Accept-Charset", "utf-8");
             c.setDoOutput(true);
             c.setDoInput(true);
             //c.setConnectTimeout(30000);//设置连接主机超时(单位:毫秒)
             //c.setReadTimeout(30000);//设置从主机读取数据超时(单位:毫秒)
             c.connect();
             System.out.println("-------begin--------");
             PrintWriter out = new PrintWriter(c.getOutputStream());//发送数据
             out.print(strXml);
             out.flush();
             out.close();
            
             //c.geth
             String header;
             for(int i=0;true;i++){
                 header=c.getHeaderField(i);
                 if(header==null)break;
                 System.out.println("header:"+header);
                 //System.out.println(c.getContentType());
             }
             int res =0;
             res = c.getResponseCode();
             System.out.println("res="+res);

             if (res == 200)
             {
             
              InputStream u=c.getInputStream();//获取servlet返回值,接收
              BufferedReader in = new BufferedReader(new InputStreamReader(u));
              buffer = new StringBuffer();
              String line = "";
              while ((line = in.readLine()) != null){
                buffer.append(line);
              }
              System.out.println(">>"+buffer.toString());
             }else
             {
            System.out.println("------接收出错了-------");
             }
             c.disconnect();
             System.out.println("-------end--------");
           
             //System.out.println();
         }catch (Exception e) {
             // TODO: handle exception
        System.out.println("异常!");
             System.out.println(e.toString());
         }
         return buffer.toString();
     }
}

这是接收数据并返回结果的servlet

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Writer;

import java.net.URLConnection;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
*
*/
/**
* @author Administrator
*
*/
public class getPhpServlet extends HttpServlet
{
    /**
     * Constructor of the object.
     */
    public getPhpServlet()
    {
        super();
    }

    /**
     * Destruction of the servlet. <br>
     */
    public void destroy()
    {
        super.destroy(); // Just puts "destroy" string in log

        // Put your code here
    }

    /**
     * The doGet method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to get.
     *
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
               throws ServletException, IOException
    {
        doPost(request, response);
    }

    /**
     * The doPost method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to
     * post.
     *
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException
    {
        response.setContentType("text/html;charset=utf-8");
        //response.setStatus(HttpServletResponse.SC_OK);
        try
        {
            String a = getDoc(request);
            System.out.println("接收数据" + a);
        }catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String back = "返回数据";
        Writer w = response.getWriter();
        w.write(back);
        w.close();
    }

    /**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException
     *             if an error occure
     */
    public void init() throws ServletException
    {
        // Put your code here
    }

    //发送数据
    public void send(URLConnection connection, String strXml)
    {
        // 产生输出流
        BufferedOutputStream out = null;
        BufferedInputStream bin = null;

        try
        {
            out = new BufferedOutputStream(connection.getOutputStream());

            String mob = null;
            mob = URLEncoder.encode(strXml, "UTF-8");
            out.write(mob.getBytes());
            out.flush();

            // 接受服务器response
            bin = new BufferedInputStream(connection.getInputStream());

            int len = bin.available();
            System.out.println("len:" + len);

            byte [] tmp = new byte[len];
            bin.read(tmp);
            System.out.println("return value:" + new String(tmp));
        }catch (Throwable t)
        {
            t.printStackTrace();
        }
    }
    // 获取post数据
    public String getDoc(HttpServletRequest request) throws Exception
    {
        char [] readerBuffer = new char[request.getContentLength()];
        BufferedReader bufferedReader = request.getReader();
        int portion = bufferedReader.read(readerBuffer);
        int amount = portion;

        while (amount < readerBuffer.length)
        {
            portion = bufferedReader.read(readerBuffer, amount,
                                          readerBuffer.length - amount);
            amount = amount + portion;
        }

        StringBuffer stringBuffer = new StringBuffer((int) (readerBuffer.length * 1.5));

        for (int index = 0; index < readerBuffer.length; index++)
        {
            char c = readerBuffer[index];
            stringBuffer.append(c);
        }

        String xml = urlDecode(stringBuffer.toString());

        return xml;
    }

    /*
     * InputStream is=request.getInputStream(); DocumentBuilderFactory
     * factory=DocumentBuilderFactory.newInstance(); DocumentBuilder
     * builder=factory.newDocumentBuilder(); Document doc=builder.parse(is);
     *
     * //获得xml字符串后,使用dom4j parse为DOM对象,就可以了�?? Document document =
     * DocumentHelper.parseText(xml);
     */
    public String urlDecode(String value)
    {
        try
        {
            return java.net.URLDecoder.decode(value, "utf-8");
        }catch (Exception ex)
        {
            ex.printStackTrace();
        }

        return value;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值