java rest httpclient_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 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访问)...相关推荐
- Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header
Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header { "Author": & ...
- java 类转换_java实体类转换有没有更优雅的方式?
属性少的话,直接set即可. 如果属性多的话,可以考虑使用Apache中的Bean工具包,主要使用 BeanUtils.copyProperties(Object dest,Object orig) ...
- 转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
转自: Springboot - 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端, ...
- 教你如何更优雅的设计Java异常
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:lrwinx https://lrwinx.github.i ...
- 快手二面:Java 里的 for (;;) 与 while (true),哪个更快?
转自:知乎 www.zhihu.com/question/52311366/answer/1300903 在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/work ...
- Effective java 系列之更优雅的关闭资源-try-with-resources
背景: 在Java编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在 ...
- python和java哪个-Java和Python现在都很热门,哪个更有前途?
Java和Python现在都很热门,哪个更有前途? 要弄明白这两种语言更有有前途,丁哥先分析一下这两种语言(Java和python)的不同 . 第1个区别就是数据类型的声明. 这两种语言都是面向对象编 ...
- java 链表反转_剑指BAT:如何最优雅着反转单链表?
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢 [题目描述] 反转单链表.例如链表为: ...
- Java里的 for (;;) 与 while (true),哪个更快?
在JDK8u的jdk项目下做个很粗略的搜索: 并没有差多少. 其次,for (;;) 在Java中的来源.个人看法是喜欢用这种写法的人,追根溯源是受到C语言里的写法的影响.这些人不一定是自己以前写C习 ...
最新文章
- 浅拷贝 python_python中什么是浅拷贝
- c++对象的动态建立和释放
- MAC电脑安装Python3下的Jupyter Notebook
- 苹果6发布时间_苹果秋季发布会将在北京时间9月16日举办
- 美图赏析:拆解USB无线网卡,电路方案非常经典
- 上网爱快?EasyRadius FOR 爱快V2接口测试版正式推出,欢迎广大爱迷们测试噢
- js 正则匹配邮箱_比较正宗的验证邮箱的正则表达式js代码详解
- 2021牛客多校9.F.Train Wreck 构造
- 易基因|靶基因DNA甲基化测序(Target-BS)
- java pdf水印排布问题_Java——PDF水印接口设计
- CoMP 协同多点传输技术
- 中学生应该养成的良好习惯
- 常用机器视觉软件介绍
- 2017年,大数据就业前景怎么样?
- Kendo UI 刷新数据源信息
- O2O、C2C、B2B、B2C是什么意思
- 数据结构实验——串的加密
- Android 主题设计全解析
- 穿梭在文字间的流浪者
- Linux战地日记——find命令
热门文章
- winform 读取用户控件的变量_winform中用户控件之间的传值
- java插入排序算法实现
- cups支持的打印机列表_lpadmin-配置CUPS套件中的打印机和类
- ElasticSearch实践(三)Rest API简介
- linux时间有几个,Linux下与文件相关的几个时间的介绍
- C语言门禁系统单片机,基于单片机的可视对讲门禁系统通信设计
- php webp decode.h,HCTF两道web题目
- 金蝶kis云+sqlserver报表分析
- 关于controller的总结 2021-04-22
- git解决冲突 删除本地_Git冲突:git pull时和本地改动冲突