Spring+Http请求+HttpClient实现传参
⼀、HttpClient简介
HTTP 协议可能是现在 Internet 上使⽤得最多、最重要的协议了,越来越多的 Java 应⽤程序需要直接通过 HTTP 协议来访问⽹络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于⼤部分应⽤程序来说,JDK 库本⾝提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的⼦项⽬,⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持 HTTP 协议最新的版本和建议。
HTTP和浏览器有点像,但却不是浏览器。很多⼈觉得既然HttpClient是⼀个HTTP客户端编程⼯具,很多⼈把他当做浏览器来理解,但是其实HttpClient不是浏览器,它是⼀个HTTP通信库,因此它只提供⼀个通⽤浏览器应⽤程序所期望的功能⼦集,最根本的区别是HttpClient中没有⽤户界⾯,浏览器需要⼀个渲染引擎来显⽰页⾯,并解释⽤户输⼊,例如⿏标点击显⽰页⾯上的某处,有⼀个布局引擎,计算如何显⽰HTML页⾯,包括级联样式表和图像。javascript解释器运⾏嵌⼊HTML页⾯或从HTML页⾯引⽤的javascript代码。来⾃⽤户界⾯的事件被传递到javascript解释器进⾏处理。除此之外,还有⽤于插件的接⼝,可以处理Applet,嵌⼊式媒体对象(如pdf⽂件,Quicktime电影和Flash动画)或ActiveX控件(可以执⾏任何操作)。HttpClient只能以编程的⽅式通过其API⽤于传输和接受HTTP消息。
HttpClient的主要功能:
实现了所有 HTTP 的⽅法(GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等)
⽀持 HTTPS 协议
⽀持代理服务器(Nginx等)等
⽀持⾃动(跳转)转向
周立波豪宅曝光⼆、Maven依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
三、GET⽆参
/**
* GET---⽆参测试
*/
@Test
public void doGetTestOne() {
// 获得Http客户端(可以理解为:你得先有⼀个浏览器;注意:实际上HttpClient与浏览器是不⼀样的)
CloseableHttpClient httpClient = ate().build();
// 创建Get请求
HttpGet httpGet = new HttpGet("localhost:12345/doGetControllerOne");
// 响应模型
CloseableHttpResponse response = null;
try {
// 由客户端执⾏(发送)Get请求
response = ute(httpGet);
// 从响应模型中获取响应实体
HttpEntity responseEntity = Entity();
System.out.println("响应状态为:" + StatusLine());
if (responseEntity != null) {
System.out.println("响应内容长度为:" + ContentLength());
System.out.println("响应内容为:" + String(responseEntity));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
e.printStackTrace();
}
}
}
四、GET有参
拼接
/**
* GET---有参测试 (⽅式⼀:⼿动在url后⾯加上参数)
*/
@Test
public void doGetTestWayOne() {
/
/ 获得Http客户端(可以理解为:你得先有⼀个浏览器;注意:实际上HttpClient与浏览器是不⼀样的)
CloseableHttpClient httpClient = ate().build();
// 参数
StringBuffer params = new StringBuffer();
try {
// 字符数据最好encoding以下;这样⼀来,某些特殊字符才能传过去(如:某⼈的名字就是“&”,不encoding的话,传不过去)      params.append("name=" + de("&", "utf-8"));
params.append("&");
params.append("age=24");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
// 创建Get请求
HttpGet httpGet = new HttpGet("localhost:12345/doGetControllerTwo" + "?" + params);
// 响应模型
CloseableHttpResponse response = null;
try {
// 配置信息
RequestConfig requestConfig = RequestConfig.custom()
// 设置连接超时时间(单位毫秒)
.setConnectTimeout(5000)
// 设置请求超时时间(单位毫秒)
.setConnectionRequestTimeout(5000)
/
/ socket读写超时时间(单位毫秒)
.setSocketTimeout(5000)
// 设置是否允许重定向(默认为true)
.setRedirectsEnabled(true).build();
// 将上⾯的配置信息运⽤到这个Get请求⾥
httpGet.setConfig(requestConfig);
// 由客户端执⾏(发送)Get请求
response = ute(httpGet);
// 从响应模型中获取响应实体
HttpEntity responseEntity = Entity();
山河令演员表介绍
System.out.println("响应状态为:" + StatusLine());
if (responseEntity != null) {
System.out.println("响应内容长度为:" + ContentLength());
System.out.println("响应内容为:" + String(responseEntity));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
URI获得HttpGet
/**
* GET---有参测试 (⽅式⼆:将参数放⼊键值对类中,再放⼊URI中,从⽽通过URI得到HttpGet实例)  */
@Test
public void doGetTestWayTwo() {
// 获得Http客户端(可以理解为:你得先有⼀个浏览器;注意:实际上HttpClient与浏览器是不⼀样的)    CloseableHttpClient httpClient = ate().build();
// 参数
URI uri = null;
try {
// 将参数放⼊键值对类NameValuePair中,再放⼊集合中
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("name", "&"));
params.add(new BasicNameValuePair("age", "18"));
// 设置uri信息,并将参数集合放⼊uri;
// 注:这⾥也⽀持⼀个键值对⼀个键值对地往⾥⾯放setParameter(String key, String value)
uri = new URIBuilder().setScheme("http").setHost("localhost")
.setPort(12345).setPath("/doGetControllerTwo")
.setParameters(params).build();
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
// 创建Get请求
HttpGet httpGet = new HttpGet(uri);
// 响应模型
CloseableHttpResponse response = null;
try {
// 配置信息
RequestConfig requestConfig = RequestConfig.custom()
// 设置连接超时时间(单位毫秒)
.setConnectTimeout(5000)
// 设置请求超时时间(单位毫秒)
.setConnectionRequestTimeout(5000)
// socket读写超时时间(单位毫秒)
.setSocketTimeout(5000)
// 设置是否允许重定向(默认为true)
.setRedirectsEnabled(true).build();
/
/ 将上⾯的配置信息运⽤到这个Get请求⾥
httpGet.setConfig(requestConfig);
// 由客户端执⾏(发送)Get请求
response = ute(httpGet);
// 从响应模型中获取响应实体
HttpEntity responseEntity = Entity();
System.out.println("响应状态为:" + StatusLine());
if (responseEntity != null) {
System.out.println("响应内容长度为:" + ContentLength());
System.out.println("响应内容为:" + String(responseEntity));
}秦汉 林青霞
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
五、POST⽆参
/**
* POST---⽆参测试
*/
@Test
public void doPostTestOne() {
// 获得Http客户端(可以理解为:你得先有⼀个浏览器;注意:实际上HttpClient与浏览器是不⼀样的)
CloseableHttpClient httpClient = ate().build();
// 创建Post请求
HttpPost httpPost = new HttpPost("localhost:12345/doPostControllerOne");
// 响应模型
CloseableHttpResponse response = null;
try {
// 由客户端执⾏(发送)Post请求
response = ute(httpPost);
// 从响应模型中获取响应实体
HttpEntity responseEntity = Entity();
System.out.println("响应状态为:" + StatusLine());
if (responseEntity != null) {
System.out.println("响应内容长度为:" + ContentLength());
System.out.println("响应内容为:" + String(responseEntity));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
六、POST有参(普通参数)
英雄联盟凯南出装
注:POST传递普通参数时,⽅式与GET⼀样即可,这⾥以直接在url后缀上参数的⽅式⽰例。
/**
* POST---有参测试(普通参数)
*/
@Test
public void doPostTestFour() {
// 获得Http客户端(可以理解为:你得先有⼀个浏览器;注意:实际上HttpClient与浏览器是不⼀样的)
CloseableHttpClient httpClient = ate().build();
/
/ 参数
StringBuffer params = new StringBuffer();
try {
// 字符数据最好encoding以下;这样⼀来,某些特殊字符才能传过去(如:某⼈的名字就是“&”,不encoding的话,传不过去)      params.append("name=" + de("&", "utf-8"));
params.append("&");
params.append("age=24");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
// 设置ContentType(注:如果只是传普通参数的话,ContentType不⼀定⾮要⽤application/json)    httpPost.setHeader("Content-Type", "application/json;charset=utf8");
// 响应模型
CloseableHttpResponse response = null;
try {
// 由客户端执⾏(发送)Post请求
response = ute(httpPost);
// 从响应模型中获取响应实体
HttpEntity responseEntity = Entity();
System.out.println("响应状态为:" + StatusLine());
if (responseEntity != null) {
System.out.println("响应内容长度为:" + ContentLength());
System.out.println("响应内容为:" + String(responseEntity));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
八年级上册历史期末试卷及答案if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
七、POST有参(对象参数)
/
**
* POST---有参测试(对象参数)
*/
@Test
public void doPostTestTwo() {
// 获得Http客户端(可以理解为:你得先有⼀个浏览器;注意:实际上HttpClient与浏览器是不⼀样的)    CloseableHttpClient httpClient = ate().build();
// 创建Post请求
HttpPost httpPost = new HttpPost("localhost:12345/doPostControllerTwo");
User user = new User();
user.setName("潘晓婷");
user.setAge(18);
user.setGender("⼥");
user.setMotto("姿势要优雅~");
// 我这⾥利⽤阿⾥的fastjson,将Object转换为json字符串;
// (需要导⼊com.alibaba.fastjson.JSON包)
String jsonString = JSONString(user);
StringEntity entity = new StringEntity(jsonString, "UTF-8");
// post请求是将参数放在请求体⾥⾯传过去的;这⾥将entity放⼊post请求体中
httpPost.setEntity(entity);
形容观众多的成语httpPost.setHeader("Content-Type", "application/json;charset=utf8");
// 响应模型
CloseableHttpResponse response = null;
try {
// 由客户端执⾏(发送)Post请求
response = ute(httpPost);