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


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

     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.HttpURLConnection;
     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         HttpURLConnection connection = (HttpURLConnection)url.openConnection();   
    24         /**  
    25          * 然后把连接设为输出模式。URLConnection通常作为输入来使用,比如下载一个Web页。  
    26          * 通过把URLConnection设为输出,你可以把数据向你个Web页传送。下面是如何做:  
    27          */  
    28         connection.setDoOutput(true);  
    29         connection.setRequestMethod("POST"); 
    30         /**  
    31          * 最后,为了得到OutputStream,简单起见,把它约束在Writer并且放入POST信息中,例如: ...  
    32          */  
    33         OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "8859_1");   
    34         out.write("username=kevin&password=*********"); //向页面传递数据。post的关键所在!   
    35         // remember to clean up   
    36         out.flush();   
    37         out.close();   
    38         /**  
    39          * 这样就可以发送一个看起来象这样的POST:   
    40          * POST /jobsearch/jobsearch.cgi HTTP 1.0 ACCEPT:  
    41          * text/plain Content-type: application/x-www-form-urlencoded  
    42          * Content-length: 99 username=bob password=someword  
    43          */  
    44         // 一旦发送成功,用以下方法就可以得到服务器的回应:   
    45         String sCurrentLine;   
    46         String sTotalString;   
    47         sCurrentLine = "";   
    48         sTotalString = "";   
    49         InputStream l_urlStream;   
    50         l_urlStream = connection.getInputStream();   
    51         // 传说中的三层包装阿!   
    52         BufferedReader l_reader = new BufferedReader(new InputStreamReader(   
    53                 l_urlStream));   
    54         while ((sCurrentLine = l_reader.readLine()) != null) {   
    55             sTotalString += sCurrentLine + "/r/n";   
    56   
    57         }   
    58         System.out.println(sTotalString);   
    59     }   
    60   
    61     public static void main(String[] args) throws IOException {   
    62         testPost();   
    63     }   
    64 }    

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

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

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

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


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

     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    
    27      } catch (Exception e) {   
    28          e.printStackTrace();   
    29      }   
    30    
    31    }   
    32      
    33    public static String extractText(String inputHtml) throws Exception {   
    34      StringBuffer text = new StringBuffer();   
    35      Parser parser = Parser.createParser(new String(inputHtml.getBytes(),"GBK"), "GBK");   
    36      // 遍历所有的节点   
    37      NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter() {   
    38          public boolean accept(Node node) {   
    39            return true;   
    40          }   
    41      });   
    42    
    43      System.out.println(nodes.size()); //打印节点的数量   
    44      for (int i=0;i<nodes.size();i++){   
    45           Node nodet = nodes.elementAt(i);   
    46           //System.out.println(nodet.getText());    
    47          text.append(new String(nodet.toPlainTextString().getBytes("GBK"))+"/r/n");             
    48      }   
    49      return text.toString();   
    50    }   
    51      
    52    public static void test5(String resource) throws Exception {   
    53      Parser myParser = new Parser(resource);   
    54      myParser.setEncoding("GBK");   
    55      String filterStr = "table";   
    56      NodeFilter filter = new TagNameFilter(filterStr);   
    57      NodeList nodeList = myParser.extractAllNodesThatMatch(filter);   
    58      TableTag tabletag = (TableTag) nodeList.elementAt(11);   
    59          
    60    }   
    61    
    62    public static void main(String[] args) throws Exception {   
    63      // test5("http://www.ggdig.com");   
    64      testHtml();   
    65    }   
    66 }
  • 相关阅读:
    Chrome浏览器扩展开发系列之三:Google Chrome浏览器扩展的架构
    Chrome浏览器扩展开发系列之一:初识Google Chrome扩展
    Chrome浏览器扩展开发系列之五:Page Action类型的Chrome浏览器扩展
    Chrome浏览器扩展开发系列之四:Browser Action类型的Chrome浏览器扩展
    鼠标定位问题总结
    Chrome浏览器扩展开发系列之八:Chrome扩展的数据存储
    Chrome浏览器扩展开发系列之七:override页面
    Chrome浏览器扩展开发系列之六:options 页面
    Chrome浏览器扩展开发系列之二:Google Chrome浏览器扩展的调试
    Chrome浏览器扩展开发系列之九:Chrome浏览器的chrome.alarms.* API
  • 原文地址:https://www.cnblogs.com/sanxinglan/p/3492164.html
Copyright © 2020-2023  润新知