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提供的一个发送请求的工具吗?它什么时候具有了实现客户端负载 ...
随机推荐
- 洛谷P1035 级数求和 题解 简单模拟
题目链接:https://www.luogu.com.cn/problem/P1035 题目描述 已知:\(S_n= 1+1/2+1/3+-+1/n\).显然对于任意一个整数 \(k\),当 \(n\ ...
- webpack4的配置你都掌握了么?
webpack5都出了,webpack4的的基本配置,解析ES6,引入CSS,编译Less,设置image等等,你都会了么? 解析ES6 了解Babel Babel是一个JavaScript编译器, ...
- 实现github的自动钩子
实现github的自动钩子 最近在学习go,也写了一些玩具放到自己的服务器中,但是感觉每次写完在本地交叉编译后上传到服务器略显麻烦,上传代码到服务器中编译也是略显麻烦,把编译文件加入到git管理中会导 ...
- C#调用Fortran生成的DLL的方法报内存不足
最近在研究一个程序,公司给的,程序是VB写的,程序里面还有一个计算的模型,用Fortran语言写的. 在调试到这个模型里面的方法时报错,说是内存不足,于是就在网上查找方法,看了两篇博客之后问题解决了. ...
- Date类与日期格式
Date类概述: 表示特定的瞬间,精确到毫秒. Date()分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒).Date(long date)分配 Date 对象并初始化此对象,以表 ...
- mac-air上安装 rabbitmq 并简单使用
简介: brew 安装 rabbitmq,docker安装rabbitmq 安装官方php-amqp 扩展 简单使用样例(发送10次helloworld
- wireshark使用过程中,卡死未响应
原因 : 未知 处理办法:1.重装wireshark ----------无效果 2.卸载有道词典-----------成功,wireshark正常运行,重装有道词典该问题必现,所以问题由有道词典引起 ...
- Scala 学习(3)之「类——基本概念1」
类 小提示:可以通过:paste进入 Scala 的多行模式,输入对应的代码块之后,按ctrl + D退出多行模式,然后再调用刚才输入的函数或者方法进行测试 //定义类,包含 field 以及方法 c ...
- Elasticsearch系列---实战零停机重建索引
前言 我们使用Elasticsearch索引文档时,最理想的情况是文档JSON结构是确定的,数据源源不断地灌进来即可,但实际情况中,没人能够阻拦需求的变更,在项目的某个版本,可能会对原有的文档结构造成 ...
- nginx服务无法停止(Windows)
本人一般停止nginx服务都是通过Windows自带的任务管理器来强制结束nginx进程实现的,如图 2.但是 这次我通过同样的方法来结束nginx服务,发现nginx的进程无法结束 3.首先我要 ...