要使用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工具类根据服务名发送请求的更多相关文章

  1. Query通过Ajax向PHP服务端发送请求并返回JSON数据

    Query通过Ajax向PHP服务端发送请求并返回JSON数据 服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据.本文将通过实例演示了jQuer ...

  2. jQuery通过Ajax向PHP服务端发送请求并返回JSON数据

    SON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.JSON在前后台交互的过程中发挥着相当出色的作用.请接着往下看教 ...

  3. [学习笔记] Oracle体系结构、下载安装、创建实例、客户端工具、网络服务名、服务管理

    Oracle体系结构 实例: 一个操作系统只有一个 Oracle 数据库 一个 Oracle 数据库可以有多个 Oracle 实例(通常只安装一个实例) 一个实例对应着一系列的后台进程和内存结构 表空 ...

  4. ajax对服务端发送请求

    //兼容处理获取ajax对象 var req = ''; if (window.XMLHttpRequest)    req = new XMLHttpRequest(); else    req = ...

  5. restTemplate工具类

    import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.sprin ...

  6. Visual Studio 2015 Bowser Link的功能不停的向服务端发送请求

    Visual Studio 2015新建的mvc项目 默认在每个视图上生成一些JavaScript脚本

  7. Java工具类_模拟HTTP POST请求

    import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.InputStream; i ...

  8. Flutter 实际开发常用工具类(全局提示,请求封装,token缓存,验证码倒计时、常用窗帘动画及布局)

    介绍: 一星期从入门到实际开发经验分享及总结           代码传送门github Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.未来App开发 ...

  9. RestTemplate的逆袭之路,从发送请求到负载均衡

    上篇文章我们详细的介绍了RestTemplate发送请求的问题,熟悉Spring的小伙伴可能会发现:RestTemplate不就是Spring提供的一个发送请求的工具吗?它什么时候具有了实现客户端负载 ...

随机推荐

  1. Spring Boot 添加Druid连接池(1.5 版本)

    Druid是一个关系型数据库连接池,是阿里巴巴的一个开源项目,地址:https://github.com/alibaba/druid .Druid不但提供连接池的功能,还提供监控功能,可以实时查看数据 ...

  2. 23.python虚拟环境配置

    1.安装 virtualenvwrapper-win pip3 install virtualenvwrapper-win 2.然后使用workon查看是否安装成功(workon是简化操作的神级命令之 ...

  3. 菜鸟学习Fabric源码学习 — 背书节点和链码容器交互

    Fabric 1.4 源码分析 背书节点和链码容器交互 本文档主要介绍背书节点和链码容器交互流程,在Endorser背书节点章节中,无论是deploy.upgrade或者调用链码,最后都会调用Chai ...

  4. 能快速理解Java_集合类_的文章

    目录 @ 这篇文章是我学习完Java集合类做的笔记和总结,如果你想认真细读这篇文章,请做好受虐的准备(建议电脑看),因为这篇文章有点长,ヽ(ー_ー)ノ. 如果在看我这篇文章过程中,发现了错误,望指点. ...

  5. Map2Shp软件字符编码解决方案——彻底杜绝Shape格式乱码

    在使用Shape文件时,如果里面有中文属性信息时,经常会遇到属性信息变为乱码.尤其是ArcGIS10.2.1之后,Esri改变了软件的默认字符编码规则,打开之前保存的Shapefile文件,总会不时遇 ...

  6. Scala实践1

    一.Scala安装和配置 1.1安装 Scala需要Java运行时库,安装Scala需要首先安装jdk. 然后在Scala官网下载 程序安装包 根据不同的操作系统选择不同的安装包,下载完成后,将安装包 ...

  7. 如何使用poi在word表格中插入行的4种方法

    本文记录了,在word表格中插入新行的几种方法.直接上代码说明 table.addNewRowBetween 没实现,官网文档也说明,只有函数名,但没具体实现,但很多文章还介绍如何使用这个函数,真是害 ...

  8. 从头学pytorch(十九):批量归一化batch normalization

    批量归一化 论文地址:https://arxiv.org/abs/1502.03167 批量归一化基本上是现在模型的标配了. 说实在的,到今天我也没搞明白batch normalize能够使得模型训练 ...

  9. cf - 429D

    Iahub and Sorin are the best competitive programmers in their town. However, they can't both qualify ...

  10. 【python系统学习05】input函数——实现人机交互

    input函数 目录 input用途 语法 示例 参数 返回值 返回值数据类型转换 容错处理 动手吧 input用途 实现人机交互: 1.你提出问题打印在屏幕上, 2.运行程序的人再输入回答. 3.按 ...