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://s4.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實現的,很不錯的一個程序。
從上面也能夠看出,註冊表單的驗證碼是多麼重要了,呵呵!