Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)

一、HttpClient

(一)HttpClient 客户端

1、HttpClient 是 apache 的开源,需要引入两个包:httpclient-4.2.4.jar 和 httpcore-4.2.2.jar。

/**
 * HttpClien 的客户端访问
 */
private void httpClientVisit() {  

    String clientResponse = "";
    try {  

        HttpClient client = new DefaultHttpClient();
        HttpPost request = new HttpPost(mUrl);  

        //不是表单数据提交,这边使用 StringEntity 即可
        //UrlEncodedFormEntity等都是 HttpEntity 接口的实现类
        StringEntity entity = new StringEntity(mRequestXml, "UTF-8");//编码
        entity.setContentType("text/xml");
        request.setEntity(entity);
        // 发送请求
        HttpResponse response = client.execute(request);  

        org.apache.http.HttpEntity httpEntity = response.getEntity();  

        if (httpEntity != null) {
            // EntityUtils.toString 如果不指定编码,EntityUtils默认会使用ISO_8859_1进行编码
            clientResponse = EntityUtils.toString(httpEntity, "UTF-8");// 记得设置编码或者如下
            // clientResponse = new String(EntityUtils.toString(httpEntity).getBytes("ISO_8859_1"), "UTF-8");
        }  

        if (clientResponse == null || "".equals(clientResponse)) {
            System.err.println("clientResponse is null or empty.");  

        }  

        System.out.println(clientResponse);  

    } catch (Exception e) {
        e.printStackTrace();
    }  

}

(二)HttpClient 详解

1、Post方式访问

/**
  * post方式提交表单(模拟用户登录请求)
  */
 public void postForm() {    

    String url = "http://localhost:8080/Java_WS_Server/rest/surpolicy/sendXml";  

     // 创建默认的httpClient实例.
    HttpClient client = new DefaultHttpClient();
     // 创建httppost
     HttpPost httppost = new HttpPost(url);
     // 创建参数队列
     List<NameValuePair> formparams = new ArrayList<NameValuePair>();
     formparams.add(new BasicNameValuePair("username", "admin"));
     formparams.add(new BasicNameValuePair("password", "123456"));
     UrlEncodedFormEntity uefEntity;
     try {
         uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); //编码
         httppost.setEntity(uefEntity);
         System.out.println("executing request " + httppost.getURI());
         HttpResponse response = client.execute(httppost);
Header[] headers = response.getAllHeaders();
for(int i=0; i<headers.length; i++){
    System.out.println(headers[i].getName());
}  

         try {
             HttpEntity entity = response.getEntity();
             if (entity != null) {
                 System.out.println("--------------------------------------");
                 System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  //编码
                 System.out.println("--------------------------------------");
             }
         } finally {    

         }
     } catch (ClientProtocolException e) {
         e.printStackTrace();
     } catch (UnsupportedEncodingException e1) {
         e1.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     } finally {    

     }
 }

  2、Get方式访问

/**
 * 发送 get请求
 */
public void get() {
    try {
        HttpClient client = new DefaultHttpClient();
        // 创建httpget.
        HttpGet httpget = new HttpGet("http://www.baidu.com/");
        System.out.println("executing request " + httpget.getURI());
        // 执行get请求.
        HttpResponse response = client.execute(httpget);
        try {
            // 获取响应实体
            HttpEntity entity = response.getEntity();
            System.out.println("--------------------------------------");
            // 打印响应状态
            System.out.println(response.getStatusLine());
            if (entity != null) {
                // 打印响应内容长度
                System.out.println("Response content length: " + entity.getContentLength());
                // 打印响应内容
                System.out.println("Response content: " + EntityUtils.toString(entity));
            }
            System.out.println("------------------------------------");
        } finally {
        }
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    }  catch (IOException e) {
        e.printStackTrace();
    } finally {}
}

  

3、乱码问题:

1)利用:UrlEncodedFormEntity等 entity 容器,实现发送内容的编码:

UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); //编码

StringEntity entity = new StringEntity(mRequestXml, "UTF-8");//编码

2、EntityUtils.toString()方法的转码,实现返回内容的编码:

EntityUtils.toString 如果不指定编码,EntityUtils默认会使用ISO_8859_1进行编码

clientResponse = EntityUtils.toString(httpEntity, "UTF-8");// 记得设置编码或者如下

clientResponse = new String(EntityUtils.toString(httpEntity).getBytes("ISO_8859_1"), "UTF-8");

二、RestTemplate

(一)RestTemplate 客户端

1、RestTemplate 是Spring的封装,需要spring的包 spring-web-3.0.7.RELEASE.jar

2、客户端代码:

/**
 * RestTemplate 客户端访问
 */
private void RestTemplateVisit() {
    String returnXml = ""; // 核心返回结果报文字符串  

    try {  

        //复杂构造函数的使用
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setConnectTimeout(1000);// 设置超时
        requestFactory.setReadTimeout(1000);  

        //利用复杂构造器可以实现超时设置,内部实际实现为 HttpClient
        RestTemplate restTemplate = new RestTemplate(requestFactory);  

        //设置HTTP请求头信息,实现编码等
        HttpHeaders requestHeaders = new HttpHeaders();
        // requestHeaders.set("Accept", "text/");
        requestHeaders.set("Accept-Charset", "utf-8");
        requestHeaders.set("Content-type", "text/xml; charset=utf-8");// 设置编码  

        //利用容器实现数据封装,发送
        HttpEntity<String> entity = new HttpEntity<String>(mRequestXml, requestHeaders);
        returnXml = restTemplate.postForObject(mUrl, entity, String.class);  

        // 转码原因:RestTemplate默认是使用org.springframework.http.converter.StringHttpMessageConverter来解析
        // StringHttpMessageConverter 默认用的 ISO-8859-1来编码的
        returnXml = new String(returnXml.getBytes("ISO-8859-1"), "utf-8");  

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }  

    System.out.println("restTemplate客户端访问返回: \n" + returnXml);
}

  具体的参考这个博客:

http://blog.csdn.net/u012228718/article/details/42028951

  

时间: 2024-10-30 20:47:55

Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)的相关文章

Spring RestTemplate: 比httpClient更优雅的Restful URL访问

{ "Author": "tomcat and jerry", "url":"http://www.cnblogs.com/tomcatandjerry/p/5899722.html" } Spring RestTemplate, 使用java访问URL更加优雅,更加方便. 核心代码: String url = "http://localhost:8080/json"; JSONObject json =

如何更优雅地对接第三方API

本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等.第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方服务的时候会去下载第三方服务的SDK开发包,也就是jar包,拷贝到自己的工程中进行开发.但现如今,几乎所有的大中小企业都使用Maven

少年,是时候换种更优雅的方式部署你的php代码了

让我们来回忆下上次你是怎么发布你的代码的: 1. 先把线上的代码用ftp备份下来 2. 上传修改了的文件 3. 测试一下功能是否正常 4. 网站500了,赶紧用备份替换回去 5. 替换错了/替换漏了 6. 一台服务器发布成功 7. 登录每一台执行一遍发布操作 8. 加班搞定 9. 老板发飙 ... 尤其现在的互联网行业,讲究快速迭代,小步快跑.像bug修复或者小功能的修改几乎每天都发版本,大功能的版本迭代每周也差不多会有一次.相信不少同行们像我上面说的这样发布自己的代码吧.或者可能先进一点,直接

框架基础:ajax设计方案(五)--- 集成promise规范,更优雅的书写代码

距离上一篇博客书写,又过去了大概几个月了,这段时间暂时离开了这个行业,让大脑休息一下.一个人旅行,一个人休息,正好也去完成一个目标 --- 拥有自己的驾照.当然,也把自己晒的黑漆马虎的.不过这一段时间虽然在技术上没有学太多东西,但是在心态上给了自己一个沉淀的机会,感觉自己变得更加沉稳和成熟,感觉这就是自己需要找到的自己,回归自我.好了,废话不多说了,虽然技术上没有学一些新的东西,但是欠的东西还是要补回来的.正如这篇博客,前端Promise规范的实现与ajax技术的集成,当时github上一个用户

使用 Promises 编写更优雅的 JavaScript 代码

你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它们写出更优雅的 JavaScript 代码. 您可能感兴趣的相关文章 开发中可能会用到的几个 jQuery 提示和技巧 精心挑选的优秀jQuery Ajax分页插件和教程 推荐几款很好用的 JavaScript 文件上传插件 精心挑选的优秀 jQuery 文本特效插件和教程 精心挑选12款优秀 jQ

[转]更优雅地绘制阴影

Box-shadow虽然是一个css3的属性,但由于浏览器支持不错,且用它来营造一种立体感.层次感着实方便,这让它成为了互联网上随处可见的css3特效.不过我感觉想写好阴影不是一件容易的事情.至少我常常摸索半天,写出来的阴影却总让人很难受. 上周在知乎上看到了一个问答,很受启发:如何理解 Material Design 中卡片的两层阴影,于是特意去看了Meterial Design的设计准则(中文翻译),觉得其中的一些设计思想和细节追求很值得我们去借签. 本文标题是“更优雅地绘制阴影”,但其实我

C#中一种替换switch语句更优雅的写法

今天在项目中遇到了使用switch语句判断条件,但问题是条件比较多,大概有几十个条件,满屏幕的case判断,是否有更优雅的写法替代switch语句呢? 假设有这样的一个场景:商场经常会根据情况采取不同的打折方案,如果打折方案比较少,可以考虑使用switch语句作判断.但如果有几十甚至几百种打折方案的时候,用switch语句就不够优雅. 先来一个打折接口. public interface IValueProcessor { decimal DaZhe(short policy,decimal o

CSS 黑魔法小技巧,让你少写不必要的JS,代码更优雅

首页 登录注册 CSS 黑魔法小技巧,让你少写不必要的JS,代码更优雅 阅读 8113 收藏 927 2017-09-26 原文链接:github.com 腾讯云容器服务CSS,立即免费体验容器集群吧!cloud.tencent.com 之前不久,由于自己平时涉猎还算广泛,总结了一篇博客:这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已,没想到受到了大家的欢迎,有人希望能博主还能整理个 CSS 的一些黑魔法小技巧,无奈我 CSS 一直很渣,没什么干货,最近写了一个 Chro

怎么让你的Python代码更优雅!

3 个可以使你的 Python 代码更优雅.可读.直观和易于维护的工具. Python 提供了一组独特的工具和语言特性来使你的代码更加优雅.可读和直观.为正确的问题选择合适的工具,你的代码将更易于维护.在本文中,我们将研究其中的三个工具:魔术方法.迭代器和生成器,以及方法魔术. 加vx:tanzhouyiwan 免费领取Python学习资料 魔术方法 魔术方法可以看作是 Python 的管道.它们被称为"底层"方法,用于某些内置的方法.符号和操作.你可能熟悉的常见魔术方法是 __ini