http://hc.apache.org/downloads.cgi
下面是代码:
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.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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
* @param charset 字符集
* @param pretty 是否美化
* @return 返回请求响应的HTML
*/
public
static String doGet(String url, String queryString, String charset,
boolean pretty) {
StringBuffer response =
new StringBuffer();
HttpClient client =
new HttpClient();
HttpMethod method =
new GetMethod(url);
try {
if (StringUtils.isNotBlank(queryString))
//对get请求参数做了http请求默认编码,好像没有任何问题,汉字编码后,就成为%式样的字符串
method.setQueryString(URIUtil.encodeQuery(queryString));
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK) {
BufferedReader reader =
new BufferedReader(
new InputStreamReader(method.getResponseBodyAsStream(), charset));
String line;
while ((line = reader.readLine()) !=
null) {
if (pretty)
response.append(line).append(System.getProperty(
"line.separator"));
else
response.append(line);
}
reader.close();
}
}
catch (URIException e) {
log.error(
"执行HTTP Get请求时,编码查询字符串“" + queryString +
"”发生异常!", e);
}
catch (IOException e) {
log.error(
"执行HTTP Get请求" + url +
"时,发生异常!", e);
}
finally {
method.releaseConnection();
}
return response.toString();
}
/**
* 执行一个HTTP POST请求,返回请求响应的HTML
*
* @param url 请求的URL地址
* @param params 请求的查询参数,可以为null
* @param charset 字符集
* @param pretty 是否美化
* @return 返回请求响应的HTML
*/
public
static String doPost(String url, Map<String, String> params, String charset,
boolean pretty) {
StringBuffer response =
new StringBuffer();
HttpClient client =
new HttpClient();
HttpMethod method =
new PostMethod(url);
//设置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) {
BufferedReader reader =
new BufferedReader(
new InputStreamReader(method.getResponseBodyAsStream(), charset));
String line;
while ((line = reader.readLine()) !=
null) {
if (pretty)
response.append(line).append(System.getProperty(
"line.separator"));
else
response.append(line);
}
reader.close();
}
}
catch (IOException e) {
log.error(
"执行HTTP Post请求" + url +
"时,发生异常!", e);
}
finally {
method.releaseConnection();
}
return response.toString();
}
public
static
void main(String[] args) {
String y = doGet(
"http://video.sina.com.cn/life/tips.html", null, "GBK", true);
System.out.println(y);
}
}
其实,这里的美化加入系统平台无关的换行符,可以任何平台上正确显示换行。
另外发现,通过JDK自带类库实现的请求,往往在请求一些url时,无法获取到请求结果。但此工具总能保证只要你的浏览器能打开,它总能忠实的将响应的内容反馈回来。
另外,将查看Java平台环境的代码给出来,很常用!
public
static
void main(String[] args) {
Properties p = System.getProperties();
for (Map.Entry<Object, Object> entry : p.entrySet()) {
System.out.println(entry.getKey() +
" = " + entry.getValue());
}
}
java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = Q:\jdk6\jre\bin
java.vm.version = 14.0-b16
java.vm.vendor = Sun Microsystems Inc.
java.vendor.url = http:
//java.sun.com/
path.separator = ;
idea.launcher.port = 7540
java.vm.name = Java HotSpot(TM) Client VM
file.encoding.pkg = sun.io
sun.java.launcher = SUN_STANDARD
user.country = CN
sun.os.patch.level = Service Pack 3
java.vm.specification.name = Java Virtual Machine Specification
user.dir = E:\NVMS\Code\sinamovie
java.runtime.version = 1.6.0_14-b08
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs = Q:\jdk6\jre\lib\endorsed
os.arch = x86
java.io.tmpdir = C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\
line.separator =
java.vm.specification.vendor = Sun Microsystems Inc.
user.variant =
os.name = Windows XP
sun.jnu.encoding = GBK
java.library.path = Q:\jdk6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;Q:\JavaFX\javafx-sdk1.2\bin;Q:\JavaFX\javafx-sdk1.2\emulator\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\StormII\Codec;C:\Program Files\StormII
java.specification.name = Java Platform API Specification
java.
class.version = 50.0
sun.management.compiler = HotSpot Client Compiler
os.version = 5.1
user.home = d:\我的文档
user.timezone = Asia/Shanghai
java.awt.printerjob = sun.awt.windows.WPrinterJob
idea.launcher.bin.path = C:\IDEA8\bin
file.encoding = UTF-8
java.specification.version = 1.6
java.
class.path = Q:\jdk6\jre\lib\alt-rt.jar;Q:\jdk6\jre\lib\charsets.jar;Q:\jdk6\jre\lib\deploy.jar;Q:\jdk6\jre\lib\javaws.jar;Q:\jdk6\jre\lib\jce.jar;Q:\jdk6\jre\lib\jsse.jar;Q:\jdk6\jre\lib\management-agent.jar;Q:\jdk6\jre\lib\plugin.jar;Q:\jdk6\jre\lib\resources.jar;Q:\jdk6\jre\lib\rt.jar;Q:\jdk6\jre\lib\ext\dnsns.jar;Q:\jdk6\jre\lib\ext\localedata.jar;Q:\jdk6\jre\lib\ext\sunjce_provider.jar;Q:\jdk6\jre\lib\ext\sunmscapi.jar;Q:\jdk6\jre\lib\ext\sunpkcs11.jar;E:\NVMS\Code\sinamovie\out\production\sinamovie;E:\NVMS\Code\sinamovie\lib\jlm\ezmorph-1.0.4.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-fileupload.jar;E:\NVMS\Code\sinamovie\lib\jotm\jotm-jms.jar;E:\NVMS\Code\sinamovie\lib\jotm\jotm-datasource.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-codec.jar;E:\NVMS\Code\sinamovie\lib\spring-jdbc.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-dbcp.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-httpclient.jar;E:\NVMS\Code\sinamovie\lib\junit\junit-3.8.2.jar;E:\NVMS\Code\sinamovie\lib\log4j\log4j-1.2.15.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-beanutils.jar;E:\NVMS\Code\sinamovie\lib\aspectjrt.jar;E:\NVMS\Code\sinamovie\lib\spring-orm.jar;E:\NVMS\Code\sinamovie\lib\jotm\jotm-client.jar;E:\NVMS\Code\sinamovie\lib\simple-xml\stax-1.2.0.jar;E:\NVMS\Code\sinamovie\lib\jotm\jotm-core.jar;E:\NVMS\Code\sinamovie\lib\spring-beans.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-digester.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-logging.jar;E:\NVMS\Code\sinamovie\lib\aspectjweaver.jar;E:\NVMS\Code\sinamovie\lib\jotm\xapool.jar;E:\NVMS\Code\sinamovie\lib\spring-aop.jar;E:\NVMS\Code\sinamovie\lib\jlm\json.jar;E:\NVMS\Code\sinamovie\lib\jlm\proxool-cglib.jar;E:\NVMS\Code\sinamovie\lib\jlm\proxool-0.9.1.jar;E:\NVMS\Code\sinamovie\lib\mysql-connector-java-5.1.6-bin.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-io.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-validator.jar;E:\NVMS\Code\sinamovie\lib\asm-util-2.2.3.jar;E:\NVMS\Code\sinamovie\lib\spring-core.jar;E:\NVMS\Code\sinamovie\lib\jlm\oscache-2.4.1.jar;E:\NVMS\Code\sinamovie\lib\spring-context.jar;E:\NVMS\Code\sinamovie\lib\ibatis\ibatis-2.3.4.726.jar;E:\NVMS\Code\sinamovie\lib\aopalliance.jar;E:\NVMS\Code\sinamovie\lib\dom4j\dom4j-1.6.1.jar;E:\NVMS\Code\sinamovie\lib\jlm\htmlparser.jar;E:\NVMS\Code\sinamovie\lib\jlm\json-lib-2.2.1-jdk15.jar;E:\NVMS\Code\sinamovie\lib\spring-jms.jar;E:\NVMS\Code\sinamovie\lib\jlm\flexjson.jar;E:\NVMS\Code\sinamovie\lib\cglib-nodep-2.1_3.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-collections.jar;E:\NVMS\Code\sinamovie\lib\jotm\jotm-standalone.jar;E:\NVMS\Code\sinamovie\lib\jlm\jeval.jar;E:\NVMS\Code\sinamovie\lib\asm-commons-2.2.3.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-attributes-compiler.jar;E:\NVMS\Code\sinamovie\lib\spring-tx.jar;E:\NVMS\Code\sinamovie\lib\junit\junit-4.4.jar;E:\NVMS\Code\sinamovie\lib\jotm\ow2-jta-1.1-spec.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-attributes-api.jar;E:\NVMS\Code\sinamovie\lib\spring-context-support.jar;E:\NVMS\Code\sinamovie\lib\simple-xml\stax-api-1.0.1.jar;E:\NVMS\Code\sinamovie\lib\dom4j\jaxen-1.1-beta-7.jar;E:\NVMS\Code\sinamovie\lib\simple-xml\simple-xml-2.0.2.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-lang.jar;E:\NVMS\Code\sinamovie\lib\asm-2.2.3.jar;E:\NVMS\Code\sinamovie\lib\spring-test.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-discovery.jar;E:\NVMS\Code\sinamovie\lib\jlm\htmllexer.jar;E:\NVMS\Code\sinamovie\lib\jakarta-commons\commons-pool.jar;C:\IDEA8\lib\idea_rt.jar
user.name = Administrator
java.vm.specification.version = 1.0
java.home = Q:\jdk6\jre
sun.arch.data.model = 32
user.language = zh
java.specification.vendor = Sun Microsystems Inc.
awt.toolkit = sun.awt.windows.WToolkit
java.vm.info = mixed mode, sharing
java.version = 1.6.0_14
java.ext.dirs = Q:\jdk6\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.
class.path = Q:\jdk6\jre\lib\resources.jar;Q:\jdk6\jre\lib\rt.jar;Q:\jdk6\jre\lib\sunrsasign.jar;Q:\jdk6\jre\lib\jsse.jar;Q:\jdk6\jre\lib\jce.jar;Q:\jdk6\jre\lib\charsets.jar;Q:\jdk6\jre\classes
java.vendor = Sun Microsystems Inc.
file.separator = \
java.vendor.url.bug = http:
//java.sun.com/cgi-bin/bugreport.cgi
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.desktop = windows
sun.cpu.isalist =
另外,我再给出一个朋友写的机器人程序,恶搞飞信诈骗网站的例子。欢迎多多运行,搞死这些骗子:
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实现的,很不错的一个程序。
从上面也可以看出,注册表单的验证码是多么重要了,呵呵!
同步请求优酷视频信息
package org.apache.http.client.fluent;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import net.sf.json.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.ContentType;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
/**
* This example demonstrates how the HttpClient fluent API can be used to handle HTTP responses
* without buffering content body in memory.
*/
public class FluentResponseHandling {
public static boolean isend = false;
public static void main(String[] args)throws Exception {
String url = "电影";
url = URLEncoder.encode(url, "utf-8");
url = "https://openapi.youku.com/v2/videos/by_category.json?client_id=5585ba4285cb3c9e&category="+url;
//url = "https://openapi.youku.com/v2/videos/by_category.json?client_id=5585ba4285cb3c9e";
//url = "http://test0919.duapp.com/";
for(int i = 0; i< 10000; i++) {
if(isend == true) {
break;
}
FluentResponseHandling.accessYouku(url + "&page=" + i);
}
}
public static void accessYouku(String url) throws Exception{
Document result = Request.Get(url)
.execute().handleResponse(new ResponseHandler<Document>() {
public Document handleResponse(final HttpResponse response) throws IOException {
StatusLine statusLine = response.getStatusLine();
HttpEntity entity = response.getEntity();
if (statusLine.getStatusCode() >= 300) {
throw new HttpResponseException(
statusLine.getStatusCode(),
statusLine.getReasonPhrase());
}
if (entity == null) {
throw new ClientProtocolException("Response contains no content");
}
// DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
// try {
// DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
// ContentType contentType = ContentType.getOrDefault(entity);
// if (!contentType.equals(ContentType.APPLICATION_XML)) {
// throw new ClientProtocolException("Unexpected content type:" + contentType);
// }
// Charset charset = contentType.getCharset();
// if (charset == null) {
// charset = Consts.ISO_8859_1;
// }
// return docBuilder.parse(entity.getContent(), charset.name());
// } catch (ParserConfigurationException ex) {
// throw new IllegalStateException(ex);
// } catch (SAXException ex) {
// throw new ClientProtocolException("Malformed XML document", ex);
// }
ContentType contentType = ContentType.getOrDefault(entity);
String charset = contentType.getCharset().name();
System.out.println("charset:" + charset);
String s = FluentResponseHandling.inputStream2String(entity.getContent(),charset);
System.out.println(s);
//parse json
JSONObject jsonObj = JSONObject.fromObject(s);
JSONArray array = jsonObj.getJSONArray("videos");
for(int i = 0 ; i< array.size();i++)
{
JSONObject dic = array.getJSONObject(i);
System.out.println(dic.get("title"));
}
if(array.size() == 0) {
isend = true;
}
return null;
}
});
// Do something useful with the result
//System.out.println(result);
}
public static String inputStream2String(InputStream is, String encode) throws IOException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i=-1;
while((i=is.read())!=-1){
baos.write(i);
}
byte[] lens = baos.toByteArray();
String result = new String(lens,encode);
is.close();
return result;
}
}