在之前,写了篇Java模拟HTTP的Get和Post请求的文章,这篇文章起源与和一个朋友砍飞信诈骗网站的问题,于是动用了Apache的comments-net包,也实现了get和post的http请求,并且将响应html代码获取。可是细心的博友提出:在获取有些网站出现乱码,最后发现没有处理字符集,这里做针对博友的意见做了增强,增强部分主要是响应内容的字符编码、相应代码的美化选项。
下面是代码:
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:jdk6jrein
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:NVMSCodesinamovie
java.runtime.version = 1.6.0_14-b08
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs = Q:jdk6jrelibendorsed
os.arch = x86
java.io.tmpdir = C:DOCUME~1ADMINI~1LOCALS~1Temp
line.separator =
java.vm.specification.vendor = Sun Microsystems Inc.
user.variant =
os.name = Windows XP
sun.jnu.encoding = GBK
java.library.path = Q:jdk6in;.;C:WINDOWSSunJavain;C:WINDOWSsystem32;C:WINDOWS;Q:JavaFXjavafx-sdk1.2in;Q:JavaFXjavafx-sdk1.2emulatorin;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Program FilesStormIICodec;C:Program FilesStormII
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:IDEA8in
file.encoding = UTF-8
java.specification.version = 1.6
java.class.path = Q:jdk6jrelibalt-rt.jar;Q:jdk6jrelibcharsets.jar;Q:jdk6jrelibdeploy.jar;Q:jdk6jrelibjavaws.jar;Q:jdk6jrelibjce.jar;Q:jdk6jrelibjsse.jar;Q:jdk6jrelibmanagement-agent.jar;Q:jdk6jrelibplugin.jar;Q:jdk6jrelib
esources.jar;Q:jdk6jrelib
t.jar;Q:jdk6jrelibextdnsns.jar;Q:jdk6jrelibextlocaledata.jar;Q:jdk6jrelibextsunjce_provider.jar;Q:jdk6jrelibextsunmscapi.jar;Q:jdk6jrelibextsunpkcs11.jar;E:NVMSCodesinamovieoutproductionsinamovie;E:NVMSCodesinamovielibjlmezmorph-1.0.4.jar;E:NVMSCodesinamovielibjakarta-commonscommons-fileupload.jar;E:NVMSCodesinamovielibjotmjotm-jms.jar;E:NVMSCodesinamovielibjotmjotm-datasource.jar;E:NVMSCodesinamovielibjakarta-commonscommons-codec.jar;E:NVMSCodesinamovielibspring-jdbc.jar;E:NVMSCodesinamovielibjakarta-commonscommons-dbcp.jar;E:NVMSCodesinamovielibjakarta-commonscommons-httpclient.jar;E:NVMSCodesinamovielibjunitjunit-3.8.2.jar;E:NVMSCodesinamovieliblog4jlog4j-1.2.15.jar;E:NVMSCodesinamovielibjakarta-commonscommons-beanutils.jar;E:NVMSCodesinamovielibaspectjrt.jar;E:NVMSCodesinamovielibspring-orm.jar;E:NVMSCodesinamovielibjotmjotm-client.jar;E:NVMSCodesinamovielibsimple-xmlstax-1.2.0.jar;E:NVMSCodesinamovielibjotmjotm-core.jar;E:NVMSCodesinamovielibspring-beans.jar;E:NVMSCodesinamovielibjakarta-commonscommons-digester.jar;E:NVMSCodesinamovielibjakarta-commonscommons-logging.jar;E:NVMSCodesinamovielibaspectjweaver.jar;E:NVMSCodesinamovielibjotmxapool.jar;E:NVMSCodesinamovielibspring-aop.jar;E:NVMSCodesinamovielibjlmjson.jar;E:NVMSCodesinamovielibjlmproxool-cglib.jar;E:NVMSCodesinamovielibjlmproxool-0.9.1.jar;E:NVMSCodesinamovielibmysql-connector-java-5.1.6-bin.jar;E:NVMSCodesinamovielibjakarta-commonscommons-io.jar;E:NVMSCodesinamovielibjakarta-commonscommons-validator.jar;E:NVMSCodesinamovielibasm-util-2.2.3.jar;E:NVMSCodesinamovielibspring-core.jar;E:NVMSCodesinamovielibjlmoscache-2.4.1.jar;E:NVMSCodesinamovielibspring-context.jar;E:NVMSCodesinamovielibibatisibatis-2.3.4.726.jar;E:NVMSCodesinamovielibaopalliance.jar;E:NVMSCodesinamovielibdom4jdom4j-1.6.1.jar;E:NVMSCodesinamovielibjlmhtmlparser.jar;E:NVMSCodesinamovielibjlmjson-lib-2.2.1-jdk15.jar;E:NVMSCodesinamovielibspring-jms.jar;E:NVMSCodesinamovielibjlmflexjson.jar;E:NVMSCodesinamovielibcglib-nodep-2.1_3.jar;E:NVMSCodesinamovielibjakarta-commonscommons-collections.jar;E:NVMSCodesinamovielibjotmjotm-standalone.jar;E:NVMSCodesinamovielibjlmjeval.jar;E:NVMSCodesinamovielibasm-commons-2.2.3.jar;E:NVMSCodesinamovielibjakarta-commonscommons-attributes-compiler.jar;E:NVMSCodesinamovielibspring-tx.jar;E:NVMSCodesinamovielibjunitjunit-4.4.jar;E:NVMSCodesinamovielibjotmow2-jta-1.1-spec.jar;E:NVMSCodesinamovielibjakarta-commonscommons-attributes-api.jar;E:NVMSCodesinamovielibspring-context-support.jar;E:NVMSCodesinamovielibsimple-xmlstax-api-1.0.1.jar;E:NVMSCodesinamovielibdom4jjaxen-1.1-beta-7.jar;E:NVMSCodesinamovielibsimple-xmlsimple-xml-2.0.2.jar;E:NVMSCodesinamovielibjakarta-commonscommons-lang.jar;E:NVMSCodesinamovielibasm-2.2.3.jar;E:NVMSCodesinamovielibspring-test.jar;E:NVMSCodesinamovielibjakarta-commonscommons-discovery.jar;E:NVMSCodesinamovielibjlmhtmllexer.jar;E:NVMSCodesinamovielibjakarta-commonscommons-pool.jar;C:IDEA8libidea_rt.jar
user.name = Administrator
java.vm.specification.version = 1.0
java.home = Q:jdk6jre
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:jdk6jrelibext;C:WINDOWSSunJavalibext
sun.boot.class.path = Q:jdk6jrelib
esources.jar;Q:jdk6jrelib
t.jar;Q:jdk6jrelibsunrsasign.jar;Q:jdk6jrelibjsse.jar;Q:jdk6jrelibjce.jar;Q:jdk6jrelibcharsets.jar;Q:jdk6jreclasses
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 =
Process finished with exit code 0
再次感谢细心博友的宝贵意见,让此工具变得更完善,更好用!
本文出自 “熔 岩” 博客,转载请与作者联系!