【转】使用java程序模拟页面发送http的post请求

在web应用程序中,一般都是通过页面发送http的post请求,但也可以使用java程序来模拟页面发送请求,代码如下:

[java]view plaincopy

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStreamWriter;
  6. import java.net.URL;
  7. import java.net.URLConnection;
  8. public class TestPost {
  9. public static void testPost() throws IOException {
  10. /**
  11. * 首先要和URL下的URLConnection对话。 URLConnection可以很容易的从URL得到。比如: // Using
  12. * java.net.URL and //java.net.URLConnection
  13. *
  14. * 使用页面发送请求的正常流程:在页面http://www.faircanton.com/message/loginlytebox.asp中输入用户名和密码,然后按登录,
  15. * 跳转到页面http://www.faircanton.com/message/check.asp进行验证
  16. * 验证的的结果返回到另一个页面
  17. *
  18. * 使用java程序发送请求的流程:使用URLConnection向http://www.faircanton.com/message/check.asp发送请求
  19. * 并传递两个参数:用户名和密码
  20. * 然后用程序获取验证结果
  21. */
  22. URL url = new URL("http://www.faircanton.com/message/check.asp");
  23. URLConnection connection = url.openConnection();
  24. /**
  25. * 然后把连接设为输出模式。URLConnection通常作为输入来使用,比如下载一个Web页。
  26. * 通过把URLConnection设为输出,你可以把数据向你个Web页传送。下面是如何做:
  27. */
  28. connection.setDoOutput(true);
  29. /**
  30. * 最后,为了得到OutputStream,简单起见,把它约束在Writer并且放入POST信息中,例如: ...
  31. */
  32. OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "8859_1");
  33. out.write("username=kevin&password=*********"); //向页面传递数据。post的关键所在!
  34. // remember to clean up
  35. out.flush();
  36. out.close();
  37. /**
  38. * 这样就可以发送一个看起来象这样的POST:
  39. * POST /jobsearch/jobsearch.cgi HTTP 1.0 ACCEPT:
  40. * text/plain Content-type: application/x-www-form-urlencoded
  41. * Content-length: 99 username=bob password=someword
  42. */
  43. // 一旦发送成功,用以下方法就可以得到服务器的回应:
  44. String sCurrentLine;
  45. String sTotalString;
  46. sCurrentLine = "";
  47. sTotalString = "";
  48. InputStream l_urlStream;
  49. l_urlStream = connection.getInputStream();
  50. // 传说中的三层包装阿!
  51. BufferedReader l_reader = new BufferedReader(new InputStreamReader(
  52. l_urlStream));
  53. while ((sCurrentLine = l_reader.readLine()) != null) {
  54. sTotalString += sCurrentLine + "/r/n";
  55. }
  56. System.out.println(sTotalString);
  57. }
  58. public static void main(String[] args) throws IOException {
  59. testPost();
  60. }
  61. }

这个程序我已经测试通过的。

如果除了post一些数据外,还要上传文件,可以使用下面两个函数之一:

[java]view plaincopy

  1. /**
  2. * 通过HTTP协议向指定的网络地址发送文件。
  3. * @param params 传输过程中需要传送的参数
  4. * @param filename 需要传送的文件在本地的位置。
  5. * @throws TransferException
  6. */
  7. public String doPost(HashMap params, InputStream stream)
  8. throws TransferException
  9. {
  10. URLConnection conn = null; // URL连结对象。
  11. BufferedReader in = null; // 请求后的返回信息的读取对象。
  12. String keyName = null;
  13. try
  14. {
  15. conn = url.openConnection();
  16. conn.setUseCaches(false);
  17. conn.setDoOutput(true);
  18. conn.setRequestProperty("Content-Type", "multipart/form-data");
  19. // 设置参数
  20. if (params != null)
  21. {
  22. Set keys = params.keySet();
  23. // 遍历参数集取得参数名称和值
  24. if (!keys.isEmpty())
  25. {
  26. Iterator iterator = keys.iterator();
  27. while (iterator.hasNext())
  28. {
  29. keyName = (String) iterator.next();
  30. // 将参数加入到连接对象中
  31. conn.addRequestProperty(
  32. keyName,
  33. (String) params.get(keyName));
  34. }
  35. }
  36. }
  37. // 构造传输文件
  38. //FileInputStream fis = new FileInputStream(filename);
  39. BufferedInputStream bis = new BufferedInputStream( stream );
  40. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  41. int ch;
  42. while ((ch = bis.read()) != -1)
  43. baos.write(ch);
  44. byte[] fileData = baos.toByteArray();
  45. // 传输文件。
  46. DataOutputStream dos =
  47. new DataOutputStream(
  48. new BufferedOutputStream(conn.getOutputStream()));
  49. dos.write(fileData);
  50. dos.flush();
  51. dos.close();
  52. in =
  53. new BufferedReader(
  54. new InputStreamReader(conn.getInputStream()));
  55. //in.close();
  56. }
  57. catch (FileNotFoundException fe)
  58. {
  59. InputStream err = ((HttpURLConnection) conn).getErrorStream();
  60. if (err == null)
  61. throw new TransferException("网络传输时发生的未知错误");
  62. in = new BufferedReader(new InputStreamReader(err));
  63. }
  64. catch (IOException ioe)
  65. {
  66. ioe.printStackTrace();
  67. throw new TransferException("网络传输错误!");
  68. }
  69. // 返回提示信息
  70. StringBuffer response = new StringBuffer();
  71. String line;
  72. try
  73. {
  74. while ((line = in.readLine()) != null)
  75. response.append(line + "/n");
  76. in.close();
  77. }
  78. catch (IOException ioe)
  79. {
  80. ioe.getStackTrace();
  81. throw new TransferException("网络响应错误!");
  82. }
  83. return response.toString();
  84. }
  85. /**
  86. * 通过HTTP协议向指定的网络地址发送文件。
  87. * @param params 传输过程中需要传送的参数
  88. * @param data 需要传送的内容。
  89. * @throws TransferException
  90. */
  91. public InputStream doPost(HashMap params, byte[] data)
  92. throws TransferException
  93. {
  94. URLConnection conn = null; // URL连结对象。
  95. BufferedReader in = null; // 请求后的返回信息的读取对象。
  96. String keyName = null;
  97. try
  98. {
  99. conn = url.openConnection();
  100. conn.setUseCaches(false);
  101. conn.setDoOutput(true);
  102. conn.setRequestProperty("Content-Type", "multipart/form-data");
  103. // 设置参数
  104. if (params != null)
  105. {
  106. Set keys = params.keySet();
  107. // 遍历参数集取得参数名称和值
  108. if (!keys.isEmpty())
  109. {
  110. Iterator iterator = keys.iterator();
  111. while (iterator.hasNext())
  112. {
  113. keyName = (String) iterator.next();
  114. // 将参数加入到连接对象中
  115. conn.addRequestProperty(
  116. keyName,
  117. (String) params.get(keyName));
  118. }
  119. }
  120. }
  121. // 传输文件。
  122. DataOutputStream dos =
  123. new DataOutputStream(
  124. new BufferedOutputStream(conn.getOutputStream()));
  125. dos.write(data);
  126. dos.flush();
  127. dos.close();
  128. return conn.getInputStream();
  129. }
  130. catch (FileNotFoundException fe)
  131. {
  132. InputStream err = ((HttpURLConnection) conn).getErrorStream();
  133. if (err == null)
  134. throw new TransferException("网络传输时发生的未知错误");
  135. else
  136. throw new TransferException("未知错误");
  137. }
  138. catch (IOException ioe)
  139. {
  140. ioe.printStackTrace();
  141. throw new TransferException("网络传输错误!");
  142. }
  143. }

这两个函数是公司的员工写的,还没有用实际的例子测试过。

我们还可以使用htmlparse的jar包(该包及相关文档可以在http://htmlparser.sourceforge.net/这里下载)提供的函数对获取的html进行解析

例子如下:

[java]view plaincopy

    1. import org.htmlparser.Node;
    2. import org.htmlparser.NodeFilter;
    3. import org.htmlparser.Parser;
    4. import org.htmlparser.filters.TagNameFilter;
    5. import org.htmlparser.tags.TableTag;
    6. import org.htmlparser.util.NodeList;
    7. public class TestHTMLParser {
    8. public static void testHtml() {
    9. try {
    10. String sCurrentLine;
    11. String sTotalString;
    12. sCurrentLine = "";
    13. sTotalString = "";
    14. java.io.InputStream l_urlStream;
    15. java.net.URL l_url = new java.net.URL("http://www.ideagrace.com/html/doc/2006/07/04/00929.html");
    16. java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url.openConnection();
    17. l_connection.connect();
    18. l_urlStream = l_connection.getInputStream();
    19. java.io.BufferedReader l_reader = new java.io.BufferedReader(new java.io.InputStreamReader(l_urlStream));
    20. while ((sCurrentLine = l_reader.readLine()) != null) {
    21. sTotalString += sCurrentLine+"/r/n";
    22. // System.out.println(sTotalString);
    23. }
    24. String testText = extractText(sTotalString);
    25. System.out.println( testText );
    26. } catch (Exception e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. public static String extractText(String inputHtml) throws Exception {
    31. StringBuffer text = new StringBuffer();
    32. Parser parser = Parser.createParser(new String(inputHtml.getBytes(),"GBK"), "GBK");
    33. // 遍历所有的节点
    34. NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter() {
    35. public boolean accept(Node node) {
    36. return true;
    37. }
    38. });
    39. System.out.println(nodes.size()); //打印节点的数量
    40. for (int i=0;i<nodes.size();i++){
    41. Node nodet = nodes.elementAt(i);
    42. //System.out.println(nodet.getText());
    43. text.append(new String(nodet.toPlainTextString().getBytes("GBK"))+"/r/n");
    44. }
    45. return text.toString();
    46. }
    47. public static void test5(String resource) throws Exception {
    48. Parser myParser = new Parser(resource);
    49. myParser.setEncoding("GBK");
    50. String filterStr = "table";
    51. NodeFilter filter = new TagNameFilter(filterStr);
    52. NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
    53. TableTag tabletag = (TableTag) nodeList.elementAt(11);
    54. }
    55. public static void main(String[] args) throws Exception {
    56. // test5("http://www.ggdig.com");
    57. testHtml();
    58. }
    59. }