HttpClient测试类请求端和服务端即可能出现乱码的解决
junit HttpClient 请求端 代码:
package com.taotao.httpclient; import java.util.ArrayList;
import java.util.List; import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.junit.Test; public class HTTPClientGTest2 { //不带参数的get请求
@Test
public void doGet() throws Exception {
//创建一个可关闭的httpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建一个get对象
HttpGet get = new HttpGet("http://localhost:8083/search/doGet/哈哈"); //注意,如果请求这里设置了 Accept header,那么 服务层的Controller 中的Mapping上就可以不用 produces属性,但是如果这样设置,那么Controller方法的返回值只能是String,否则结果无法封装会调用者
get.setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8")); //执行请求
CloseableHttpResponse response = httpClient.execute(get);
//取响应结果
//先获取响应码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("======响应码:"+statusCode); //200
//获取响应结果对象
HttpEntity entity = response.getEntity();
//将结果对象转换为字符串
String string = EntityUtils.toString(entity,"utf-8");
//结果:=======结果值:username: 张三 password: 123
System.out.println("======结果值:"+string);
//关闭资源
response.close();
httpClient.close();
} //带参数的get请求
@Test
public void doGetWithParam() throws Exception {
//创建一个可关闭的httpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault(); //带参数方法1:直接拼接在请求中 创建get对象
/*HttpGet get = new HttpGet(
"http://localhost:8083/search/doGetWithParam?username=花千骨&password=123");*/ //带参数方法2 用对象的方式添加参数
//先创建一个基本的(不带参数的)uri对象
URIBuilder uriBuilder = new URIBuilder("http://localhost:8083/search/doGetWithParam");
uriBuilder.addParameter("username", "花千骨");
uriBuilder.addParameter("password", "123");
//再创建get对象
HttpGet get = new HttpGet(uriBuilder.build()); //注意,如果请求这里设置了 Accept header,那么 服务层的Controller 中的Mapping上就可以不用 produces属性,但是如果这样设置,那么Controller方法的返回值只能是String,否则结果无法封装会调用者
get.setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8")); //执行请求
CloseableHttpResponse response = httpClient.execute(get);
//取响应结果
//先获取响应码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("======响应码:"+statusCode);
//获取响应结果对象
HttpEntity entity = response.getEntity();
//将结果对象转换为字符串
String string = EntityUtils.toString(entity,"utf-8");
//======结果值:username: 花千骨 password: 123
System.out.println("======结果值:"+string);
//关闭资源
response.close();
httpClient.close();
} //不带参数的 post 请求
@Test
public void doPost() throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
// HttpPost post = new HttpPost("http://localhost:8082/httpclient/post.html");
// 注意:如果请求的url后缀是 .html则浏览器不能返回正确的json数据,会返回406错误,所以需要修改请求url的后缀为其他
// HttpPost post = new HttpPost("http://localhost:8082/httpclient/post.action");
HttpPost post = new HttpPost("http://localhost:8083/search/doPost/哈哈");
//注意,如果请求这里设置了 Accept header,那么 服务层的Controller 中的Mapping上就可以不用 produces属性
post.setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8")); CloseableHttpResponse response = httpClient.execute(post);
HttpEntity entity = response.getEntity();
String string = EntityUtils.toString(entity, "utf-8");
System.out.println(string);
response.close();
httpClient.close();
} //带参数的post请求
@Test
public void doPostWithParam() throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建一个post对象
HttpPost post = new HttpPost("http://localhost:8083/search/doPostWithParam");
//注意,如果请求这里设置了 Accept header,那么 服务层的Controller 中的Mapping上就可以不用 produces属性,但是如果这样设置,那么Controller方法的返回值只能是String,否则结果无法封装会调用者
post.setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8")); //模拟一个表单
List<NameValuePair> kvList = new ArrayList<NameValuePair>();
kvList.add(new BasicNameValuePair("username", "张三"));
kvList.add(new BasicNameValuePair("password", "123"));
//包装成一个Entity对象(后面加字符集是为了向服务端发送数据时不会乱码)
StringEntity paramEntity = new UrlEncodedFormEntity(kvList,"utf-8");
//设置请求内容
post.setEntity(paramEntity);
//执行post请求
CloseableHttpResponse response = httpClient.execute(post);
HttpEntity rtnEntity = response.getEntity();
String string = EntityUtils.toString(rtnEntity, "utf-8");
System.out.println(string);
response.close();
httpClient.close();
}
}
对应的 springMVC 的 Controller 端代码:
package com.taotao.search.controller; import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
public class HttpClientController { //无参数的get请求
/*prodcues的目的是为了返回给调用者时中文不乱码,
* 如果接口调用者请求的 http对象设置了
* httpget.setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8"));
* 那么这里服务端可以不加produces,否则必须加
*/
@RequestMapping(value="/doGet/{pid}",produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8")
@ResponseBody
public String doGet(@PathVariable String pid){
System.out.println("============== "+pid); //这里不会乱码 哈哈
String username = "张三";
String password = "123";
String result = "username: "+username+"\tpassword: "+password;
return result;
} //带参数的get请求响应
/**
* 同理,如果 接口调用者中 没有加 setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8")
* 这里必须加上 produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8"
*/
@RequestMapping(value="/doGetWithParam",produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8")
@ResponseBody
public String doGetWithParam(String username,String password) throws Exception{
//====== username: è±å骨password: 123
System.out.println("====== username: "+username +"password: "+password);
//为了避免乱码我们需要转码(带参数的 get 请求,必须在这里转码)
username = new String(username.getBytes("iso8859-1"), "utf-8");
password = new String(password.getBytes("iso8859-1"), "utf-8");
//===转码后=== username: 花千骨password: 123
System.out.println("===转码后=== username: "+username +"password: "+password);
String result = "username: "+username+"\tpassword: "+password;
return result;
} //不带参数的 post请求
@RequestMapping(value="/doPost/{pid}",produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8")
@ResponseBody
public String doPost(@PathVariable String pid){
System.out.println("============== "+pid); //哈哈
String username = "张三";
String password = "123";
String result = "username: "+username+"\tpassword: "+password;
return result;
} //带参数的 post 请求
/**
* 同理,如果 接口调用者中 没有加 setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8")
* 这里必须加上 produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8"
*/
//注意:post请求,后台服务接收端不用对参数进行转码
@RequestMapping(value="/doPostWithParam"/*,produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8"*/)
@ResponseBody
public String doPost(String username,String password){
//====== username: 张三password: 123
System.out.println("====== username: "+username +"password: "+password);
String result = "username: "+username+"\tpassword: "+password;
return result;
}
}
注意项总结:
1、无论哪种请求//注意,如果请求端设置了 Accept header 例如:
httpget.setHeader(new BasicHeader("Accept", "text/plain;charset=utf-8"));
那么 服务层的Controller 中的Mapping上就可以不用 produces属性,否则服务端的Controller中比如加入:
produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8"
这样才能保证请求端接收到的结果中的中文编码正确。
但是,如果请求端设置了 Accept header ,那么Controller的方法的返回值 只能是 String类型,否则结果无法封装会调用者,
所有强烈建议不要这样做,最好还是在 Controller端返回值为字符串时,设置 produces 属性
2、对于带参数的 get 请求,必须在服务端 Controller 中进行字符串转码 例如:
username = new String(username.getBytes("iso8859-1"), "utf-8");
否则接收到的参数就是乱码
HttpClient测试类请求端和服务端即可能出现乱码的解决的更多相关文章
- 写个OAuth2.0的请求端来测试自己的OAuth2.0服务端(二)
在上一篇文章中,我们介绍了怎么创建自己的服务器,现在我们开始写个client端,来测试. 我们创建一个MVC项目,叫TestOAuthClient 1. 代码开始 1)第一步,我们创建一个MainCo ...
- HTTP服务端JSON服务端
HTTP服务端JSON服务端 最后更新日期: 2014-5-18 Author: Kagula 阅读前提: CMake工具的基本使用 内容简介: CPPCMS是个开源Web开发框架,通过它可以很容易 ...
- 【转】京东金融App端链路服务端全链路压测策略
京东金融移动端全链路压测历时三个月,测试和服务端同学经过无数日日夜夜,通宵达旦,终于完成了移动端链路的测试任务.整个测试有部分涉及到公司敏感数据,本文只对策略部分进行论述. 1.系统架构与策略 在聊性 ...
- 恩布企业IM PC端,服务端公布 1.16 版本号
恩布企业IM PC端,服务端公布1.16版本号,开源企业IM.免费企业即时通讯软件:主要版本号更新内容: 恩布服务端核心程序,添加进程守护保护机制,确保系统7*24持续稳定服务: 服务端添加内存数据库 ...
- HttpURLConnection 发送PUT请求 json请求体 与服务端接收
发送请求: public void testHttp() { String result = ""; try { URL postURL = new URL("http: ...
- socketserver及相关的类 (处理socket服务端)+ event事件的使用
编写简单的套接字服务器并不难,然而,如果要创建的并非简单服务器,还要求助于服务器模块. 模块SocketServer是标准库提供的服务器框架的基石,这个框架包括好多服务器,他们基本服务器的基础上添加了 ...
- SimpleRpc-客户端与服务端工作模型探讨
前言 本篇文章讲述客户端与服务端的具体设计细节.有细心的小伙伴发现,客户端和服务端的工作方式不一样:服务端是多线程计算模型,利用工作线程完成数据的读取,而客户端是单线程(利用Reactor线程完成数据 ...
- jetty 客服端 与服务端
jetty 服务端,客服端有请求buffter 检查 默认4kb 4096 客服端 HttpClient client=new HttpClient(); client.setRequestBuffe ...
- 客服端与服务端APP支付宝支付接口联调的那些坑
根据支付宝官方提供的文档的建议: TIPS:这一步应在商户服务端完成,商户服务端直接将组装和签名后的请求串orderString传给客户端,客户端直接传给SDK发起请求.文档和Demo是为了示例效果在 ...
随机推荐
- Tensorflow 笔记:第一讲
一. 基本概念 1. 什么是人工智能 人工智能的概念: 机器模拟人的意识和思维 重要人物: 艾伦·麦席森·图灵( Alan Mathison Turing) 人物简介: 1912 年 6 月 23 日 ...
- 003---socket介绍
socket介绍 什么是socket? socket是应用层与tcp/ip协议族通信的中间软件抽象层,它是一组接口.在设计模式中.其实就是一个门面模式.我们无需深入理解tcp/udp协议,socket ...
- Python3爬虫(五)解析库的使用之XPath
Infi-chu: http://www.cnblogs.com/Infi-chu/ XPath: 全称是 XML Path Language,XML路径语言,它是一门在XML文档中和HTML文档中查 ...
- 浅析express以及express中间件
一.express: 1.express: Express是什么? Express是基于node.js平台的web应用开发框架: 作用:可以实现快速搭建骨架: 优点:开发web应用更加方便,更加快捷. ...
- P1331 海战
P1331 海战 题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防 ...
- Android ImageSwitcher 配合Picasso解决内存溢出(OOM)问题
最近项目中用到了 ImageSwitcher 来实现图片切换,使用起来很简单,但发现当图片比较大(超过了3M)时,程序出现了内存溢出(OOM)问题而崩溃了. 原因就是图片太大了,显示到 ImageVi ...
- IDEA 中.properties文件中文自动转Unicode编码及乱码问题
问题描述: 在使用IDEA开发工具编辑属性文件(.properties)的时候出现中文自动转成了Unicode编码,或在读取属性文件的时候中文出现乱码. 问题解决: 进入 File -> Set ...
- Linux-Shell脚本编程-学习-4-Shell编程-操作数字-加减乘除计算
对于任何一种编程语言都很重要的特性就是操作数字的能力,遗憾的是,对于shell脚本来说,这个过程比较麻烦,在shell脚本中有两种途径来进行数学运算操作. 1.expr 最开始的时候,shell提供了 ...
- 数据库sql命令
本文为转载,原文地址:http://www.cnblogs.com/cangqiongbingchen/p/4530333.html 1.说明:创建数据库CREATE DATABASE databas ...
- Cross Entropy in Machine Learning
整理摘自:https://blog.csdn.net/tsyccnh/article/details/79163834 信息论 Outline 1. 信息量与信息熵 2. 相对熵(KL散度) 3. 交 ...