一、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 formparams = new ArrayList();

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

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 entity = new HttpEntity(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

java rest httpclient_Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)...相关推荐

  1. Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header

    Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header { "Author": & ...

  2. java 类转换_java实体类转换有没有更优雅的方式?

    属性少的话,直接set即可. 如果属性多的话,可以考虑使用Apache中的Bean工具包,主要使用 BeanUtils.copyProperties(Object dest,Object orig) ...

  3. 转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)

    转自: Springboot - 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端, ...

  4. 教你如何更优雅的设计Java异常

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:lrwinx https://lrwinx.github.i ...

  5. 快手二面:Java 里的 for (;;) 与 while (true),哪个更快?

    转自:知乎 www.zhihu.com/question/52311366/answer/1300903 在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/work ...

  6. Effective java 系列之更优雅的关闭资源-try-with-resources

    背景: 在Java编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在 ...

  7. python和java哪个-Java和Python现在都很热门,哪个更有前途?

    Java和Python现在都很热门,哪个更有前途? 要弄明白这两种语言更有有前途,丁哥先分析一下这两种语言(Java和python)的不同 . 第1个区别就是数据类型的声明. 这两种语言都是面向对象编 ...

  8. java 链表反转_剑指BAT:如何最优雅着反转单链表?

    前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢 [题目描述] 反转单链表.例如链表为: ...

  9. Java里的 for (;;) 与 while (true),哪个更快?

    在JDK8u的jdk项目下做个很粗略的搜索: 并没有差多少. 其次,for (;;) 在Java中的来源.个人看法是喜欢用这种写法的人,追根溯源是受到C语言里的写法的影响.这些人不一定是自己以前写C习 ...

最新文章

  1. 浅拷贝 python_python中什么是浅拷贝
  2. c++对象的动态建立和释放
  3. MAC电脑安装Python3下的Jupyter Notebook
  4. 苹果6发布时间_苹果秋季发布会将在北京时间9月16日举办
  5. 美图赏析:拆解USB无线网卡,电路方案非常经典
  6. 上网爱快?EasyRadius FOR 爱快V2接口测试版正式推出,欢迎广大爱迷们测试噢
  7. js 正则匹配邮箱_比较正宗的验证邮箱的正则表达式js代码详解
  8. 2021牛客多校9.F.Train Wreck 构造
  9. 易基因|靶基因DNA甲基化测序(Target-BS)
  10. java pdf水印排布问题_Java——PDF水印接口设计
  11. CoMP 协同多点传输技术
  12. 中学生应该养成的良好习惯
  13. 常用机器视觉软件介绍
  14. 2017年,大数据就业前景怎么样?
  15. Kendo UI 刷新数据源信息
  16. O2O、C2C、B2B、B2C是什么意思
  17. 数据结构实验——串的加密
  18. Android 主题设计全解析
  19. 穿梭在文字间的流浪者
  20. Linux战地日记——find命令

热门文章

  1. winform 读取用户控件的变量_winform中用户控件之间的传值
  2. java插入排序算法实现
  3. cups支持的打印机列表_lpadmin-配置CUPS套件中的打印机和类
  4. ElasticSearch实践(三)Rest API简介
  5. linux时间有几个,Linux下与文件相关的几个时间的介绍
  6. C语言门禁系统单片机,基于单片机的可视对讲门禁系统通信设计
  7. php webp decode.h,HCTF两道web题目
  8. 金蝶kis云+sqlserver报表分析
  9. 关于controller的总结 2021-04-22
  10. git解决冲突 删除本地_Git冲突:git pull时和本地改动冲突