RestTemplate工具类根据服务名发送请求
要使用RestTemplate 根据服务名发送请求的话需要 使用 @LoadBalanced 这个注解,用了这个注解的RestTemplate就不用使用 ip 来请求了,首先要创建一个配置类
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate; /**
* @Author: dx
* @Description:
* @Date: 2020/2/14 0014
* @Version: 1.0
*/
@Configuration
public class RestTemplateConfig { @LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
然后是工具类
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.xin.xunwu.base.Exception.BizException;
import com.xin.xunwu.base.response.ApiResult;
import com.xin.xunwu.entity.ServiceApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.*;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder; import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Optional; /**
* @author dx
*/
@Slf4j
@Component
public class RestUtil { public static final String HTTP = "http://"; public static final String[] HTTP_METHODS = {"POST", "GET"}; @Resource
private RestTemplate restTemplate; public ResponseEntity<JSONObject> restQuery(ServiceApi serviceApi) {
String methodStr = serviceApi.getMethod().toUpperCase();
// 请求类型错误
if (!Arrays.asList(HTTP_METHODS).contains(methodStr)) {
throw new BizException(ApiResult.getErrorResult("30059"));
}
// 根据服务名和路径拼接url
String url = HTTP + serviceApi.getService() + serviceApi.getPath();
MultiValueMap<String, String> params = null;
MultiValueMap<String, String> headers = null; // 转换参数
try {
params = jsonToMap(serviceApi.getParams());
headers = jsonToMap(serviceApi.getHeader());
} catch (Exception e) {
e.printStackTrace();
// json 转换错误
throw new BizException(ApiResult.getErrorResult("30060"));
}
HttpMethod method = HttpMethod.resolve(methodStr);
return restQuery(url, params, method, headers);
} private MultiValueMap<String, String> jsonToMap(String jsonStr) {
if (jsonStr == null) {
return null;
}
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
MultiValueMap<String, String> result = new LinkedMultiValueMap<>();
jsonObject.forEach((key, value) -> result.add(key, value.toString()));
return result;
} private ResponseEntity<JSONObject> restQuery(String url, MultiValueMap<String, String> paramsMap,
HttpMethod method, MultiValueMap<String, String> headerMap) {
ResponseEntity<JSONObject> responseEntity = null;
// 转换编码格式
List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> httpMessageConverter : list) {
if (httpMessageConverter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter)
httpMessageConverter).setDefaultCharset(StandardCharsets.UTF_8);
break;
}
} // 设置头信息
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON)); // 头信息非空的话,添加头信息
Optional.ofNullable(headerMap).ifPresent(httpHeaders::addAll); // 设置头信息和请求参数
HttpEntity<MultiValueMap<String, String>> params = new HttpEntity<>(paramsMap, httpHeaders);
// 如果是get请求的话需要把参数拼到url上
if(method.equals(HttpMethod.GET)){
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
paramsMap.forEach(builder::queryParam);
url = builder.build().encode().toString();
} try {
responseEntity = restTemplate.exchange(url, method, params, JSONObject.class);
} catch (Exception e) {
// 请求失败
log.warn("restTemplate error [message] {}", e.getMessage());
}
return responseEntity;
}
}
然后是用到的一个实体类,这个不是必须的,可以根据自己的需要修改,我这是业务需求
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Id;
import java.util.Date; /**
@author Generator
@since 2020-02-13T10:38:02.789
**/
@Getter
@Setter
public class ServiceApi {
/**
* 通过ID生成器自动生成
*/
@Id
private Long id; /**
* 编号
*/
private String number; /**
* 服务名(注册服务名称)
*/
private String service; /**
* 方法
*/
private String method; /**
* 路径
*/
private String path; /**
* 头信息
*/
private String header; /**
* 请求体
*/
private String body; /**
* 参数
*/
private String params; /**
* 接口类型(drop:下拉选 verify:验证)
*/
private String type; /**
* 备注
*/
private String remark; /**
* 删除标记(0:未删除;1:已删除)
*/
@Column(name = "delete_flg")
private String deleteFlg; /**
* 创建时间
*/
@Column(name = "create_time")
private Date createTime; /**
* 创建者
*/
private Long creator; /**
* 更新时间
*/
@Column(name = "update_time")
private Date updateTime; /**
* 更新者
*/
private Long updator;
}
RestTemplate工具类根据服务名发送请求的更多相关文章
- Query通过Ajax向PHP服务端发送请求并返回JSON数据
Query通过Ajax向PHP服务端发送请求并返回JSON数据 服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据.本文将通过实例演示了jQuer ...
- jQuery通过Ajax向PHP服务端发送请求并返回JSON数据
SON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.JSON在前后台交互的过程中发挥着相当出色的作用.请接着往下看教 ...
- [学习笔记] Oracle体系结构、下载安装、创建实例、客户端工具、网络服务名、服务管理
Oracle体系结构 实例: 一个操作系统只有一个 Oracle 数据库 一个 Oracle 数据库可以有多个 Oracle 实例(通常只安装一个实例) 一个实例对应着一系列的后台进程和内存结构 表空 ...
- ajax对服务端发送请求
//兼容处理获取ajax对象 var req = ''; if (window.XMLHttpRequest) req = new XMLHttpRequest(); else req = ...
- restTemplate工具类
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.sprin ...
- Visual Studio 2015 Bowser Link的功能不停的向服务端发送请求
Visual Studio 2015新建的mvc项目 默认在每个视图上生成一些JavaScript脚本
- Java工具类_模拟HTTP POST请求
import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.InputStream; i ...
- Flutter 实际开发常用工具类(全局提示,请求封装,token缓存,验证码倒计时、常用窗帘动画及布局)
介绍: 一星期从入门到实际开发经验分享及总结 代码传送门github Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.未来App开发 ...
- RestTemplate的逆袭之路,从发送请求到负载均衡
上篇文章我们详细的介绍了RestTemplate发送请求的问题,熟悉Spring的小伙伴可能会发现:RestTemplate不就是Spring提供的一个发送请求的工具吗?它什么时候具有了实现客户端负载 ...
随机推荐
- Spring Boot 添加Druid连接池(1.5 版本)
Druid是一个关系型数据库连接池,是阿里巴巴的一个开源项目,地址:https://github.com/alibaba/druid .Druid不但提供连接池的功能,还提供监控功能,可以实时查看数据 ...
- 23.python虚拟环境配置
1.安装 virtualenvwrapper-win pip3 install virtualenvwrapper-win 2.然后使用workon查看是否安装成功(workon是简化操作的神级命令之 ...
- 菜鸟学习Fabric源码学习 — 背书节点和链码容器交互
Fabric 1.4 源码分析 背书节点和链码容器交互 本文档主要介绍背书节点和链码容器交互流程,在Endorser背书节点章节中,无论是deploy.upgrade或者调用链码,最后都会调用Chai ...
- 能快速理解Java_集合类_的文章
目录 @ 这篇文章是我学习完Java集合类做的笔记和总结,如果你想认真细读这篇文章,请做好受虐的准备(建议电脑看),因为这篇文章有点长,ヽ(ー_ー)ノ. 如果在看我这篇文章过程中,发现了错误,望指点. ...
- Map2Shp软件字符编码解决方案——彻底杜绝Shape格式乱码
在使用Shape文件时,如果里面有中文属性信息时,经常会遇到属性信息变为乱码.尤其是ArcGIS10.2.1之后,Esri改变了软件的默认字符编码规则,打开之前保存的Shapefile文件,总会不时遇 ...
- Scala实践1
一.Scala安装和配置 1.1安装 Scala需要Java运行时库,安装Scala需要首先安装jdk. 然后在Scala官网下载 程序安装包 根据不同的操作系统选择不同的安装包,下载完成后,将安装包 ...
- 如何使用poi在word表格中插入行的4种方法
本文记录了,在word表格中插入新行的几种方法.直接上代码说明 table.addNewRowBetween 没实现,官网文档也说明,只有函数名,但没具体实现,但很多文章还介绍如何使用这个函数,真是害 ...
- 从头学pytorch(十九):批量归一化batch normalization
批量归一化 论文地址:https://arxiv.org/abs/1502.03167 批量归一化基本上是现在模型的标配了. 说实在的,到今天我也没搞明白batch normalize能够使得模型训练 ...
- cf - 429D
Iahub and Sorin are the best competitive programmers in their town. However, they can't both qualify ...
- 【python系统学习05】input函数——实现人机交互
input函数 目录 input用途 语法 示例 参数 返回值 返回值数据类型转换 容错处理 动手吧 input用途 实现人机交互: 1.你提出问题打印在屏幕上, 2.运行程序的人再输入回答. 3.按 ...