天天看點

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 

        public static String doPost(String url, Map<String, String> params) { 

                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); 

                        log.error("執行HTTP Post請求" + url + "時,發生異常!", e); 

        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="http://blog.51cto.com/js/message.js" type=text/javascript></SCRIPT> 

<SCRIPT language=javascript src="http://blog.51cto.com/js/user_comment.js" type=text/javascript></SCRIPT> 

<SCRIPT language=javascript src="http://blog.51cto.com/js/base2.js" type=text/javascript></SCRIPT> 

<SCRIPT language=javascript src="http://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(){ 

    return true; 

function copylink(ourl){ 

  if(!ourl){ 

    var clipBoardContent = "http://lavasoft.blog.51cto.com"; 

    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{ 

#layout_3{ 

.albumalert{ 

  width:250px; 

  height:150px; 

  background:#fff; 

  border:1px solid #777; 

.alerttitle{ 

  text-align:left; 

  color:#000; 

  padding:6px; 

  background-image:url("http://img1.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實作的,很不錯的一個程式。

從上面也可以看出,系統資料庫單的驗證碼是多麼重要了,呵呵!

本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/168276,如需轉載請自行聯系原作者