• [Java] 模拟HTTP的Get和Post请求


    在之前,写了篇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

    再次感谢细心博友的宝贵意见,让此工具变得更完善,更好用!

    本文出自 “熔 岩” 博客,转载请与作者联系!

    转载自:http://lavasoft.blog.51cto.com/62575/175911/

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    Lucene.net 搜索引擎的中文资料
    构建ambari
    mkisofs 制作iso镜像文件
    sed命令将换行转换为逗号
    centos6.5修改系统时间的时区
    Ambari集群安装部署问题
    rpm下载离线安装包并且安装
    虚拟机克隆CentOS后的网卡配置-——解决网络不通问题
    mysql数据库,中文显示问号
    linux文件权限
  • 原文地址:https://www.cnblogs.com/jqmtony/p/3711264.html
Copyright © 2020-2023  润新知