Java模拟HTTP的Get和Post请求
 
借助Apache Commons-httpclient的力量,轻松实现了对HTTP请求的模拟!
 
下面是一个测试代码:
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
* HTTP工具箱
*
* @author leizhimin 2009-6-19 16:36:18
*/

public final class HttpTookit {
        private static Log log = LogFactory.getLog(HttpTookit.class);

        /**
         * 执行一个HTTP GET请求,返回请求响应的HTML
         *
         * @param url                 请求的URL地址
         * @param queryString 请求的查询参数,可以为null
         * @return 返回请求响应的HTML
         */

        public static String doGet(String url, String queryString) {
                String response = null;
                HttpClient client = new HttpClient();
                HttpMethod method = new GetMethod(url);
                try {
                        if (StringUtils.isNotBlank(queryString))
                                method.setQueryString(URIUtil.encodeQuery(queryString));
                        client.executeMethod(method);
                        if (method.getStatusCode() == HttpStatus.SC_OK) {
                                response = method.getResponseBodyAsString();
                        }
                } catch (URIException e) {
                        log.error("执行HTTP Get请求时,编码查询字符串“" + queryString + "”发生异常!", e);
                } catch (IOException e) {
                        log.error("执行HTTP Get请求" + url + "时,发生异常!", e);
                } finally {
                        method.releaseConnection();
                }
                return response;
        }

        /**
         * 执行一个HTTP POST请求,返回请求响应的HTML
         *
         * @param url        请求的URL地址
         * @param params 请求的查询参数,可以为null
         * @return 返回请求响应的HTML
         */

        public static String doPost(String url, Map<String, String> params) {
                String response = null;
                HttpClient client = new HttpClient();
                HttpMethod method = new PostMethod(url);
                for (Iterator it = params.entrySet().iterator(); it.hasNext();) {

                }
                //设置Http Post数据
                if (params != null) {
                        HttpMethodParams p = new HttpMethodParams();
                        for (Map.Entry<String, String> entry : params.entrySet()) {
                                p.setParameter(entry.getKey(), entry.getValue());
                        }
                        method.setParams(p);
                }
                try {
                        client.executeMethod(method);
                        if (method.getStatusCode() == HttpStatus.SC_OK) {
                                response = method.getResponseBodyAsString();
                        }
                } catch (IOException e) {
                        log.error("执行HTTP Post请求" + url + "时,发生异常!", e);
                } finally {
                        method.releaseConnection();
                }

                return response;
        }

        public static void main(String[] args) {
                String x = doPost("http://lavasoft.blog.51cto.com/62575/64994", new HashMap());
                System.out.println(x);
        }
}
 
运行后打印结果如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="Content-Type"  content="text/html;  charset=gb2312">
<title>Java中使用正则表达式校验字符串 - 熔    岩 - 51CTO技术博客</title>
<meta name="description" content="Java中使用正则表达式校验字符串正则表达式是某一位伟大的数学家发明的,现在已经形成了一个ISO标准,这个标准和编程语言没有关系。至于具体谁发明的,怎么发明的,我也忘记了:)。 正则表达式简单理解就是..">
<meta name="keywords" content="Java中使用正则表达式校验字符串">
<meta http-equiv="Cache-Control" content="private">
<base href="http://lavasoft.blog.51cto.com/"></base>
<script src="/js/def.js"></script>
<SCRIPT language=javascript src="https://blog.51cto.com/js/message.js" type=text/javascript></SCRIPT>
<SCRIPT language=javascript src="https://blog.51cto.com/js/user_comment.js" type=text/javascript></SCRIPT>
<SCRIPT language=javascript src="https://blog.51cto.com/js/base2.js" type=text/javascript></SCRIPT>
<SCRIPT language=javascript src="https://blog.51cto.com/js/dialog_utf8.js" type=text/javascript></SCRIPT>
<link href="/css/skin/2.css" rel="stylesheet" type="text/css">
<link href="/css/group/group.css" rel="stylesheet" type="text/css">
<link rel="alternate" href="../rss.php?uid=62575" type="application/rss+xml" title="RSS 2.0">
<link rel="edituri" type="application/rsd+xml" title="rsd" href="xmlrpc.php?rsd=1" />
<script>
var myid = "";
function add_flink(){
  if(myid){
    var url='/mod/edit_flink.php?type=addflink&uid=62575&flink=http://lavasoft.blog.51cto.com';
    var ajax = InitAjax1();
    ajax.open("GET", url, true);
    ajax.onreadystatechange = function() {
      if (ajax.readyState == 4 && ajax.status == 200) {
        if(ajax.responseText==""){
          alert("添加成功。");
        }
        if(ajax.responseText=="1"){
        alert("链接指向自己。");
        }
        if(ajax.responseText=="2"){
        alert("友情链接已存在。")
        }
      }
    }
    ajax.send(null);
  }else{

  var refurlk = "http://lavasoft.blog.51cto.com/62575/64994";    

    commentSubmit("",refurlk);
    return false;
  }
    
}
function sendmessage(){

  var refurlk = "http://lavasoft.blog.51cto.com/62575/64994";    

  if(myid){
    return true;
  }else{
    commentSubmit("",refurlk);
    return false;
  }
}
function copylink(ourl){
  if(!ourl){
    var clipBoardContent = "http://lavasoft.blog.51cto.com";
  }else{
    var clipBoardContent = ourl;
  }
  window.clipboardData.setData("Text",clipBoardContent);
  alert("复制成功!");
  return false;
}
function correctPNG() {
if (document.getElementById('blog_touxian'))
{
var img = document.getElementById('blog_touxian');
            var imgName = img.src.toUpperCase()
            var imgID = (img.id) ? "id='" + img.id + "' " : ""
            var imgClass = (img.className) ? "class='" + img.className + "' " : ""
            var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
            var imgStyle = "display:inline-block;" + img.style.cssText    
            if (img.align == "left") imgStyle = "float:left;" + imgStyle
            if (img.align == "right") imgStyle = "float:right;" + imgStyle
            if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle                
            var strNewHTML = "<span " + imgID + imgClass + imgTitle
                 + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
                 + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
                 + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>" ;
            img.outerHTML = strNewHTML;
}    
}
//window.attachEvent(" correctPNG);
window.
</script>
<style type="text/css">
#layout_0{
  width:;
  float:left;
}
#layout_1{
  width:;
  float:left;
}
#layout_3{
  width:;
  float:left;
}
.albumalert{
  width:250px;
  height:150px;
  background:#fff;
  border:1px solid #777;
}
.alerttitle{
  text-align:left;
  color:#000;
  padding:6px;
  background-p_w_picpath:url("https://s1.51cto.com/images/quickwindow.jpg");
  background-repeat:repeat-x;
  font-size:14px;
  height:22px;
}
.alertcentent{
  line-height:30px;
}
.alertcentent p{
color:#000;
}
 
以上代码省略了N多行。
 
另外,我再给出一个朋友写的机器人程序,恶搞飞信诈骗网站的例子。欢迎多多运行,搞死这些骗子:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;

import com.verisign.uuid.UUID;

/**
* 向一个飞信诈骗网站自动提交垃圾信息的程序,用空可以运行一下。
* @author wangpeng
*
*/

public class AutoSubmit {

  /**
    * @param args
    * @throws Exception    
    */

  public static void main(String[] args) throws Exception {
    for(int i=0; i < 100000; i++){
      post(i);
    }
  }
    
  private static void post(int i) throws Exception{
    String s = UUID.generate().toString();
    String s1 = s.substring(0,2);
    s = s1+ s.substring(s.length() - 3, s.length());
    
    URL url = new URL("http://yfs88.sv10.sgedns.cn/yy/e/qq22.asp");// 提交地址
    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
    httpURLConnection.setDoOutput(true);// 打开写入属性
    httpURLConnection.setDoInput(true);// 打开读取属性
    httpURLConnection.setRequestMethod("POST");// 设置提交方法
    httpURLConnection.setConnectTimeout(50000);// 连接超时时间
    httpURLConnection.setReadTimeout(50000);
    httpURLConnection.connect();
    
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(httpURLConnection.getOutputStream(), "GBK"));
    out.write("name=" + s + i +  //用户名不能重复
        "&password=748" +
        "&sex=日你很行" +
        "&oicq=748748" +
        "&icq=748748" +
        "&msn=caonima" +
        "&shengri=再不关门滚蛋,就把你们全关起来" +
        "&home=已经盯上你们了");//要post的数据,多个以&符号分割
    out.flush();
    out.close();

    

    //读取post之后的返回值
//    BufferedReader in = new BufferedReader(new InputStreamReader((InputStream) httpURLConnection.getInputStream()));
//    String line = null;
//    StringBuilder sb = new StringBuilder();
//    while ((line = in.readLine()) != null) {
//      sb.append(line);
//    }
//    in.close();
//    System.out.println("client:" + sb.toString());
    
    httpURLConnection.disconnect();//断开连接

    //
    System.out.println("client post ok:" + i);
  }

}
 
上面程序师通过JDK的原生API实现的,很不错的一个程序。
从上面也可以看出,注册表单的验证码是多么重要了,呵呵!