【转】使用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. }
时间: 2024-10-01 02:50:12

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

java程序模拟浏览器访问Web服务器的处理过程

import java.net.*; import java.io.*; /* * 演示浏览器访问Web服务器的处理过程 */ public class WebServerDemo { public static void main(String[] args)throws IOException{ ServerSocket ss=new ServerSocket(10000); Socket s=ss.accept(); byte[] bytes=new byte[1024]; int len

一个简单java程序模拟与Mysql Server建立连接及发送查询SQL

使用普通socket来模拟与Mysql Server建立连接及发送查询SQL,如下代码所示: Socket socket = new  Socket("127.0.0.1",3306); OutputStream out = socket.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(out); //建立连接报文信息 来自wireshark(捕捉终端执行mysql -u root -p -h

Java程序模拟公安局人员管理系统

Java 编程题:公安人员的管理系统1) 学生类:a) 属性:i. 身份号-默认没有,需要手动进行输入ii. 姓名iii. 性别iv. 年龄v. 密码vi. 居住地址vii. 注册日期viii. 人员的信誉程度( 0:无犯罪历史, 1:有过轻度犯罪历史 2:严重犯罪历史 3:杀人罪但是有期徒刑 4:杀人罪并执行死刑 5:个人荣誉小贴士 6:国家级别荣誉奖章)ix. 文化程度( 0:没有教育历史(包括幼儿园) 1:小学文化 2:初中文化 3:高中文化 4:大学文化(硕士生) 5:研究生 6:博士生

Java socket模拟HTTP协议客户端之POST请求

相比于GET请求,POST报文多了如下几个要素: 1,Content-Length,这个是上送报文的长度,以字节为单位 2,Content-Type,这主要是涉及到报文的格式和字符集. 3,就是主报文 主类SimpleHttpPost: package com.zws.http; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSock

C#模拟http 发送post或get请求

/// <summary> /// 根据经纬度获取城市名称 /// </summary> /// <param name="lat">纬度</param> /// <param name="lng">经度</param> /// <returns>城市名称</returns> public static string GetCity(string lat, string

Oracle触发器如何调用Java实现Openfire消息发送

写在前面,要想实现整个过程的成功执行请先准备以下文件: 1. 登陆Openfire服务端以及Spark客户端相关程序(openfire_4_0_1.exe.spark_2_7_6.exe) 2. 连接Openfire和Oracle相关的jar包(presence.jar.smack.jar.smackx-debug.jar.smackx.jar.ojdbc.jar)  Step1:安装Openfire服务端并配置数据库连接,配置参考<Openfire服务器安装与配置教程> Step2:在Ecl

【Java】向一个页面发送post请求并获取其处理之后的结果与用javascript创建一个表单后提交的安全性

本文对比与<[Java]读取网页中的内容>(点击打开链接)一文,向一个页面发送get请求,并获取其处理之后的结果,这里是向一个页面发送post请求,并获取其处理之后的结果.如果向一个页面发送get请求,并获取其处理之后的结果,只需要直接读取一个网页用?后接各种用&参数连接的参数即可,而向一个页面发送post请求,并获取其处理之后的结果,就不是这么简单了. 这里方法可能在普通的Java文件中不会太常见,但在jsp.安卓等javaweb的网页编程中却十分常用 import java.io.

使用Java程序发送Email

    目前很多大型的网站忘记登录密码常见的一种形式是使用邮箱找回密码  最近做项目也有这个需求  现在总结一下  以便以后查看 使用到的包有 mailapi.jar smtp.jar   封装发送邮件的实体 package com.tes; import java.util.Date; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mai

Java程序猿学习当中各个阶段的建议

回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议 引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论“面试前该不该刷题”这个