要使用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. k8s-自动安装

    操作环境: centos7.3 node102-master-192.168.100.102 node103-node1-192.168.100.103 node104-node2-192.168.1 ...

  2. (01)大话设计模式-简单工厂-java实现

    1.运算接口 public interface Operation { public double getResult(double NumberA , double NumberB); } 2.加减 ...

  3. Essential C++学习笔记

    1.当我们调用一个函数时,会在内存中建立起一块特殊区域,称为“程序栈”,这块特殊区域提供了每个函数参数的存储空间,它也提供函数所定义的每个对象的内存空间--我们将这些对象称为局部对象.一旦函数完成,这 ...

  4. Web及网络基础学习(一)

    ---恢复内容开始--- 2019.10.16 1.TCP.IP分层  应用层.网络层.传输层.数据链路层 2.各层讲解 应用层 决定了向用户提供应用服务时通信的活动.例如FTP(File Trans ...

  5. 每日一问2:堆(heap)和栈(stack)的区别

    因为这里没有明确指出堆是指数据结构还是存储方式,所以两个尝试都回答一下. 一.堆和栈作为数据结构 1.堆(heap),也叫做优先队列(priority queue),队列中允许的操作是先进先出(FIF ...

  6. 【记】VirtualBox安装CentOS6

    推荐随笔 VirtualBox中安装CentOS-6.6虚拟机 问题1: 在选择虚拟硬盘大小时,最好不要用默认的8G 我的分区 /boot 200M swap 1024M /home 4096M / ...

  7. linux修改环境变量的三种方法【转】

    [环境变量配置的三个方法] 如想将一个路径加入到$PATH中,可以像下面这样做:  1. 控制台中,不赞成使用这种方法,因为换个shell,你的设置就无效了,因此这种方法仅仅是临时使用,以后要使用的时 ...

  8. try catch 自定义捕获异常

    当我们完成一个程序时,如果没有异常捕获的话,用户使用时会出现许多bug.而加入异常捕获之后便会提醒用户使用时避免产生不必要的错误.具体操作实现如下: 首先创造一个MyException类,继承自Exc ...

  9. linux下文件解压缩中文乱码问题的解决

    将带中文文件名的压缩文件上传到服务器,使用unzip解压后,文件名乱码: 临时解决方法: 通过unzip行命令解压,指定字符集unzip -O CP936 xxx.zip (用GBK, GB18030 ...

  10. gcd竞赛模板

    int gcd(int a,int b) { ) return a; return gcd(b,a%b); }