【微服务~远程调用】RestTemplate基本操作快速入门
🔎这里是【微服务~远程调用】,关注我学习云原生不迷路
👍如果对你有帮助,给博主一个免费的点赞以示鼓励
欢迎各位🔎点赞👍评论收藏⭐️
👀专栏介绍
【微服务~远程调用】 目前主要更新微服务,一起学习一起进步。
👀本期介绍
本期主要介绍RestTemplate基本操作快速入门
文章目录
RestTemplate
概述
-
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
搭建环境
-
拷贝BaseResult
-
编写测试类:TestRest
-
package com.czxy;
-
-
public class TestRest {
-
}
基本操作
GET请求
-
注意:使用RestTemplate封装数据时,BaseResult必须提供==无参构造==。
-
@Test
-
public void testFindAll(){
-
String url = "http://localhost:7778/user";
-
//1 创建对象
-
RestTemplate restTemplate = new RestTemplate();
-
//2 发送请求并获得数据
-
ResponseEntity<BaseResult> entity = restTemplate.getForEntity(url, BaseResult.class);
-
//3.1 状态
-
System.out.println(entity.getStatusCode());
-
//3.2 响应数据
-
System.out.println(entity.getBody().getData());
-
}
GET请求:转换泛型异常
-
查询用户时,如果返回类型为BaseResult,默认不支持泛型信息。及不支持 BaseResult<List<User>>
-
需要使用 exchange 设置具体的泛型信息
-
-
@Test
-
public void testFindAll2(){
-
String url = "http://localhost:7778/user";
-
//1 创建对象
-
RestTemplate restTemplate = new RestTemplate();
-
//2 发送请求并获得数据
-
ResponseEntity<BaseResult<List<User>>> entity = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<BaseResult<List<User>>>() {});
-
//3 获得响应,并打印
-
BaseResult<List<User>> baseResult = entity.getBody();
-
List<User> data = baseResult.getData();
-
for (User user : data) {
-
System.out.println(user);
-
}
-
-
}
POST请求
-
@Test
-
public void testAdd(){
-
String url = "http://localhost:7778/user";
-
RestTemplate restTemplate = new RestTemplate();
-
-
User user = new User(1,"jack","1234",18);
-
ResponseEntity<BaseResult> entity = restTemplate.postForEntity(url ,user , BaseResult.class);
-
-
System.out.println(entity.getStatusCode());
-
System.out.println(entity.getBody());
-
}
PUT请求
-
@Test
-
public void testUpdate(){
-
String url = "http://localhost:7778/user";
-
RestTemplate restTemplate = new RestTemplate();
-
User user = new User(1,"jack","1234",18);
-
restTemplate.put(url ,user);
-
System.out.println("修改成功");
-
}
Delete请求
-
@Test
-
public void testDelete(){
-
String url = "http://localhost:7778/user/1";
-
RestTemplate restTemplate = new RestTemplate();
-
restTemplate.delete(url);
-
System.out.println("删除成功");
-
}
HttpClient高级
HttpClient 关闭日志输出
-
基于spring boot 测试启动器,自动开启日志输出
-
spring boot 默认采用logback 进行日志管理的
-
如何管理日志输出:关闭日志输出
-
在resources/logback.xml
-
<configuration debug="false"></configuration>
HttpClient连接池
-
分析
-
使用HttpClients.custom()可以构建自定义 CloseableHttpClient 对象
-
setConnectionManager 用于配置连接
-
setDefaultRequestConfig 用于配置请求
-
-
通过PoolingHttpClientConnectionManager 可以为连接配置连接数和并发数
-
通过 RequestConfig.custom() 可以配置各种超时时间
-
-
代码
-
-
@Test
-
public void testDemo01() throws IOException {
-
//1 配置连接管理
-
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
-
// 1.1 设置最大连接数
-
connectionManager.setMaxTotal(1000);
-
// 1.2 设置并发访问数
-
connectionManager.setDefaultMaxPerRoute(20);
-
-
//2 请求配置
-
RequestConfig requestConfig = RequestConfig.custom()
-
.setConnectTimeout(1000)
-
.setConnectionRequestTimeout(500)
-
.setSocketTimeout(10 * 1000)
-
.build();
-
-
// 3 获得工具类
-
CloseableHttpClient httpClient = HttpClients.custom()
-
.setConnectionManager(connectionManager)
-
.setDefaultRequestConfig(requestConfig)
-
//重定向策略
-
.setRedirectStrategy(new LaxRedirectStrategy())
-
.build();
-
-
// 4 发送请求
-
CloseableHttpResponse response = null;
-
try {
-
HttpGet httpGet = new HttpGet("http://localhost:7778/user");
-
-
response = httpClient.execute(httpGet);
-
-
if(response.getStatusLine().getStatusCode() == 200){
-
String str = EntityUtils.toString(response.getEntity(),"UTF-8");
-
System.out.println(str);
-
}
-
} catch (IOException e) {
-
e.printStackTrace();
-
} finally {
-
response.close();
-
}
-
-
}
SpringBoot整合HttpClient
概述
-
SpringBoot官方并没有对HttpClient的启动器。所以我们需要自己完成配置
配置
-
步骤一:修改yml文件,添加连接池配置
-
# http配置
-
http:
-
maxTotal: 300
-
defaultMaxPerRoute: 50
-
connectTimeout: 1000
-
connectionRequestTimeout: 500
-
socketTimeout: 5000
- 步骤二: 编写配置类
-
package com.czxy.config;
-
-
import lombok.Setter;
-
import org.apache.http.client.HttpClient;
-
import org.apache.http.client.config.RequestConfig;
-
import org.apache.http.conn.HttpClientConnectionManager;
-
import org.apache.http.impl.client.CloseableHttpClient;
-
import org.apache.http.impl.client.HttpClients;
-
import org.apache.http.impl.client.LaxRedirectStrategy;
-
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
-
-
@Configuration
-
@ConfigurationProperties(prefix = "http")
-
@Setter
-
public class HttpConfig {
-
-
private Integer maxTotal;
-
private Integer defaultMaxPerRoute;
-
private Integer connectTimeout;
-
private Integer connectionRequestTimeout;
-
private Integer socketTimeout;
-
private Integer staleConnectionCheckEnabled;
-
-
@Bean
-
public PoolingHttpClientConnectionManager connectionManager(){
-
//1 配置连接管理
-
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
-
// 1.1 设置最大连接数
-
connectionManager.setMaxTotal(maxTotal);
-
// 1.2 设置并发访问数
-
connectionMan1ager.setDefaultMaxPerRoute(defaultMaxPerRoute);
-
return connectionManager;
-
}
-
-
@Bean
-
public RequestConfig requestConfig(){
-
//2 请求配置
-
RequestConfig requestConfig = RequestConfig.custom()
-
.setConnectTimeout(connectTimeout)
-
.setConnectionRequestTimeout(connectionRequestTimeout)
-
.setSocketTimeout(socketTimeout)
-
.build();
-
return requestConfig;
-
}
-
-
@Bean
-
public HttpClient httpClient(HttpClientConnectionManager connectionManager, RequestConfig requestConfig){
-
// 3 获得工具类
-
CloseableHttpClient httpClient = HttpClients.custom()
-
.setConnectionManager(connectionManager)
-
.setDefaultRequestConfig(requestConfig)
-
//重定向策略
-
.setRedirectStrategy(new LaxRedirectStrategy())
-
.build();
-
return httpClient;
-
}
-
}
测试:get请求
-
package com.czxy;
-
-
import org.apache.http.HttpResponse;
-
import org.apache.http.client.HttpClient;
-
import org.apache.http.client.methods.HttpGet;
-
import org.apache.http.util.EntityUtils;
-
import org.junit.Test;
-
import org.junit.runner.RunWith;
-
import org.springframework.boot.test.context.SpringBootTest;
-
import org.springframework.test.context.junit4.SpringRunner;
-
-
import javax.annotation.Resource;
-
import java.io.IOException;
-
-
@RunWith(SpringRunner.class)
-
@SpringBootTest(classes = HttpApplication.class)
-
public class TestBootHttp {
-
@Resource
-
private HttpClient httpClient;
-
-
@Test
-
public void testDemo01() throws IOException {
-
String url = "http://localhost:7778/user";
-
HttpGet httpGet = new HttpGet(url);
-
HttpResponse response = httpClient.execute(httpGet);
-
if(response.getStatusLine().getStatusCode() == 200){
-
String str = EntityUtils.toString(response.getEntity());
-
System.out.println(str);
-
}
-
-
}
-
-
}
RestTemplate整合HttpClient
RestTemplate整合HttpClient -- 配置类
-
package com.czxy.config;
-
-
import lombok.Setter;
-
import org.apache.http.client.HttpClient;
-
import org.apache.http.client.config.RequestConfig;
-
import org.apache.http.conn.HttpClientConnectionManager;
-
import org.apache.http.impl.client.CloseableHttpClient;
-
import org.apache.http.impl.client.HttpClients;
-
import org.apache.http.impl.client.LaxRedirectStrategy;
-
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
import org.springframework.http.client.ClientHttpRequestFactory;
-
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
-
import org.springframework.http.converter.HttpMessageConverter;
-
import org.springframework.http.converter.StringHttpMessageConverter;
-
import org.springframework.web.client.RestTemplate;
-
-
import java.nio.charset.Charset;
-
import java.util.List;
-
-
/**
-
* @author 桐叔
-
* @email liangtong@itcast.cn
-
*/
-
@Configuration
-
@ConfigurationProperties(prefix = "http")
-
@Setter
-
public class HttpConfig {
-
-
private Integer maxTotal;
-
private Integer defaultMaxPerRoute;
-
private Integer connectTimeout;
-
private Integer connectionRequestTimeout;
-
private Integer socketTimeout;
-
private Integer staleConnectionCheckEnabled;
-
-
@Bean
-
public PoolingHttpClientConnectionManager connectionManager(){
-
//1 配置连接管理
-
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
-
// 1.1 设置最大连接数
-
connectionManager.setMaxTotal(maxTotal);
-
// 1.2 设置并发访问数
-
connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);
-
return connectionManager;
-
}
-
-
@Bean
-
public RequestConfig requestConfig(){
-
//2 请求配置
-
RequestConfig requestConfig = RequestConfig.custom()
-
.setConnectTimeout(connectTimeout)
-
.setConnectionRequestTimeout(connectionRequestTimeout)
-
.setSocketTimeout(socketTimeout)
-
.build();
-
return requestConfig;
-
}
-
-
@Bean
-
public HttpClient httpClient(HttpClientConnectionManager connectionManager, RequestConfig requestConfig){
-
// 3 获得工具类
-
CloseableHttpClient httpClient = HttpClients.custom()
-
.setConnectionManager(connectionManager)
-
.setDefaultRequestConfig(requestConfig)
-
//重定向策略
-
.setRedirectStrategy(new LaxRedirectStrategy())
-
.build();
-
return httpClient;
-
}
-
-
-
@Bean
-
public ClientHttpRequestFactory requestFactory(HttpClient httpClient ){
-
return new HttpComponentsClientHttpRequestFactory(httpClient);
-
}
-
-
@Bean
-
public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory){
-
RestTemplate template = new RestTemplate(requestFactory);
-
//乱码处理
-
List<HttpMessageConverter<?>> list = template.getMessageConverters();
-
for (HttpMessageConverter<?> mc : list) {
-
if (mc instanceof StringHttpMessageConverter) {
-
((StringHttpMessageConverter) mc).setDefaultCharset(Charset.forName("UTF-8"));
-
}
-
}
-
return template;
-
}
-
-
}
测试类
-
package com.czxy;
-
-
import com.czxy.domain.User;
-
import com.czxy.vo.BaseResult;
-
import org.junit.Test;
-
import org.junit.runner.RunWith;
-
import org.springframework.boot.test.context.SpringBootTest;
-
import org.springframework.http.ResponseEntity;
-
import org.springframework.test.context.junit4.SpringRunner;
-
import org.springframework.web.client.RestTemplate;
-
-
import javax.annotation.Resource;
-
-
-
@RunWith(SpringRunner.class)
-
@SpringBootTest(classes = HttpApplication.class)
-
public class TestBootRest {
-
-
@Resource
-
private RestTemplate restTemplate;
-
-
@Test
-
public void testAdd(){
-
String url = "http://localhost:7778/user";
-
-
User user = new User(1,"jack","1234",18);
-
ResponseEntity<BaseResult> entity = restTemplate.postForEntity(url ,user , BaseResult.class);
-
-
System.out.println(entity.getStatusCode());
-
System.out.println(entity.getBody());
-
}
-
}
案例:管理员登录
分析
数据库
-
CREATE TABLE t_user(
-
uid INT PRIMARY KEY AUTO_INCREMENT,
-
username VARCHAR(50),
-
`password` VARCHAR(32),
-
age INT
-
);
-
INSERT INTO t_user(uid,username,`password`,age) VALUES(1,'jack','1234',18);
文章来源: blog.csdn.net,作者:陶然同学,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_45481821/article/details/125264143
- 点赞
- 收藏
- 关注作者
评论(0)