RestTemplate 远程调用工具封装

一、 前言

我们平时在使用SpringCloud 、SpringCloudAlibaba 或其他微服务框架时,如果在同一个项目中可能会采用feign / openfeign ,但是当把项目单独出来再去和原微服务架构体系进行集成时就不大灵活,今天我就介绍一种,远程调用工具RestTemplate 不仅可以用在微服务之间,也可以调用第三方接口。

二、框架

SpringBoot 2.6.6 + SpringCloud 2021.0.3 + SpringCloud alibaba 2021.0.1.0
+mysql 8.0.27

三、配置

RestTemplateConfig

package com.lq.common.config;import com.lq.common.filter.HeaderRequestInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;@Configuration
public class RestTemplateConfig {@AutowiredHeaderRequestInterceptor headerRequestInterceptor;//实现远程调用@Bean@LoadBalancedpublic RestTemplate restTemplate() {RestTemplate restTemplate = new RestTemplate();List<HttpMessageConverter<?>> converterList  = restTemplate.getMessageConverters();// 重新设置StringHttpMessageConverter字符集为UTF-8,解决中文乱码问题HttpMessageConverter<?> converterTarget = null;for (HttpMessageConverter<?> item : converterList) {if (StringHttpMessageConverter.class == item.getClass()) {converterTarget = item;break;}}if (null != converterTarget) {converterList.remove(converterTarget);}converterList.add(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));restTemplate.setInterceptors(Collections.singletonList(headerRequestInterceptor));restTemplate.setRequestFactory(getOkHttp3ClientHttpRequestFactory());return restTemplate;}// 设置超时时间private SimpleClientHttpRequestFactory getClientHttpRequestFactory() {SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();// Connect timeout 6sclientHttpRequestFactory.setConnectTimeout(100000);// Read timeout 6sclientHttpRequestFactory.setReadTimeout(100000);return clientHttpRequestFactory;}private OkHttp3ClientHttpRequestFactory getOkHttp3ClientHttpRequestFactory(){OkHttp3ClientHttpRequestFactory okHttp3ClientHttpRequestFactory = new OkHttp3ClientHttpRequestFactory();okHttp3ClientHttpRequestFactory.setConnectTimeout(100000);okHttp3ClientHttpRequestFactory.setReadTimeout(100000);return okHttp3ClientHttpRequestFactory;}}

RestApiUtil

package com.lq.common.util;import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.lq.common.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;import javax.annotation.PostConstruct;
import java.util.*;/*** @Description 远程调用工具类* @Author hqd* @Date 2023-12-02*/
@Slf4j
@Component
public class RestApiUtil {@Autowiredprivate RestTemplate restTemplate;private static RestTemplate restTemplate2;@PostConstructpublic void init(){restTemplate2 = restTemplate;}/***  查询 返回对象* @param httpMethod: 方法类型 get / post* @param serverName:  服务名* @param uri:服务地址* @param paramsMap: get 请求参数* @param body: body 请求参数* @param responseTypeClazz: 返回类型* @return <T>*/public static <T> T requsetForObject(HttpMethod httpMethod,String serverName, String uri,Map<String,Object> paramsMap,Object body, Class<T> responseTypeClazz) throws Exception {T t = null;
//        try {if (ObjectUtil.isNotEmpty(paramsMap)){StringBuilder sb = new StringBuilder();sb.append(uri+"?");for (Map.Entry entry:paramsMap.entrySet()){sb.append(entry.getKey()+"={"+entry.getKey()+"}"+"&");}uri =sb.substring(0,sb.length()-1).toString();}HttpEntity httpEntity =null;if (ObjectUtil.isNotEmpty(body)){httpEntity = new HttpEntity(body);}t= restTemplate2.exchange("http://"+serverName+uri , httpMethod,httpEntity, responseTypeClazz,paramsMap).getBody();
//        }catch (Exception e){
//            e.printStackTrace();
//            log.error(e.getMessage());
//        }return t;}/*** 查询返回List* @param httpMethod :方法类型 get / post* @param serverName: 服务名* @param uri:服务地址* @param paramsMap:get 请求参数* @param body:body 请求参数* @return <T>*/public static <T> List<T>  requestForList(HttpMethod httpMethod,String serverName, String uri,Map<String,Object> paramsMap,Object body,Class<T> clazz) throws Exception {List<T> result = null;
//        try {if (ObjectUtil.isNotEmpty(paramsMap)){StringBuilder sb = new StringBuilder();sb.append(uri+"?");for (Map.Entry entry:paramsMap.entrySet()){sb.append(entry.getKey()+"={"+entry.getKey()+"}"+"&");}uri =sb.substring(0,sb.length()-1).toString();}HttpEntity httpEntity =null;if (ObjectUtil.isNotEmpty(body)){httpEntity = new HttpEntity(body);}if (ObjectUtil.isNull(paramsMap)){paramsMap = new HashMap<>();}ParameterizedTypeReference<List<T>> responseType = new ParameterizedTypeReference<List<T>>() {};result = restTemplate2.exchange("http://" + serverName + uri, httpMethod, httpEntity, responseType, paramsMap).getBody();if(CollectionUtil.isNotEmpty(result)){for (int i =0;i<result.size();i++){result.set(i,JSONObject.parseObject(JSONObject.toJSONBytes(result.get(i)), clazz));}}
//            result.stream().map(v->{
//                v= JSONObject.parseObject(JSONObject.toJSONBytes(v), clazz);
//                return v;
//            });
//        }catch (Exception e){
//            e.printStackTrace();
//            log.error(e.getMessage());
//        }return result;}/*** 查询返回Map* @param httpMethod: 请求类型 Get / Post* @param serverName:服务名* @param uri:请求方法路径* @param paramsMap:get 请求参数* @param body: 请求body* @return Map<String,Object>*/public static Map<String,Object> requestForMap(HttpMethod httpMethod,String serverName, String uri, Map<String,Object> paramsMap,Object body) throws Exception {Map<String, Object> result = null;
//        try {if (ObjectUtil.isNotEmpty(paramsMap)){StringBuilder sb = new StringBuilder();sb.append(uri+"?");for (Map.Entry entry:paramsMap.entrySet()){sb.append(entry.getKey()+"={"+entry.getKey()+"}"+"&");}uri =sb.substring(0,sb.length()-1).toString();}HttpEntity httpEntity =null;if (ObjectUtil.isNotEmpty(body)){httpEntity = new HttpEntity(body);}if (ObjectUtil.isNull(paramsMap)){paramsMap = new HashMap<>();}ParameterizedTypeReference<Map<String, Object>> responseType = new ParameterizedTypeReference<Map<String, Object>>() {};result = restTemplate2.exchange("http://" + serverName + uri, httpMethod, httpEntity, responseType, paramsMap).getBody();
//        }catch (Exception e){
//            e.printStackTrace();
//            log.error(e.getMessage());
//        }return result;}/***  查询Map<String,List<T>>* @param httpMethod: 请求类型 Get / Post* @param serverName:服务名* @param uri:请求方法路径* @param paramsMap:get 请求参数* @param body: 请求body* @param clazz: T class 类型* @return <T>*/public static <T> Map<String,List<T>> requestForMapListT(HttpMethod httpMethod,String serverName, String uri,Map<String,?> paramsMap,Object body,Class<T> clazz) throws Exception {Map<String, List<T>> result = null;
//        try {if (ObjectUtil.isNotEmpty(paramsMap)){StringBuilder sb = new StringBuilder();sb.append(uri+"?");for (Map.Entry entry:paramsMap.entrySet()){sb.append(entry.getKey()+"={"+entry.getKey()+"}"+"&");}uri =sb.substring(0,sb.length()-1).toString();}HttpEntity httpEntity =null;if (ObjectUtil.isNotEmpty(body)){httpEntity = new HttpEntity(body);}if (ObjectUtil.isNull(paramsMap)){paramsMap = new HashMap<>();}ParameterizedTypeReference<Map<String, List<T>>> responseType = new ParameterizedTypeReference<Map<String, List<T>>>() {};result = restTemplate2.exchange("http://" + serverName + uri, httpMethod, httpEntity, responseType, paramsMap).getBody();if (ObjectUtil.isNotEmpty(result)){Set<Map.Entry<String, List<T>>> entries = result.entrySet();for (Map.Entry entry: entries){List<LinkedHashMap> _result = (List<LinkedHashMap>) entry.getValue();List<T> list = new ArrayList<>();if (CollectionUtil.isNotEmpty(_result)){for (LinkedHashMap map : _result){T  t = JSONObject.parseObject(JSONObject.toJSONBytes(map), clazz);list.add(t);}}entry.setValue(list);}}//        }catch (Exception e){
//            e.printStackTrace();
//            log.error(e.getMessage());
//        }return result;}/*** 查询返回自定义Result<T>* @param httpMethod: 请求类型 Get / Post* @param serverName:服务名* @param uri:请求方法路径* @param paramsMap:get 请求参数* @param body: 请求body* @return <T>*/public static <T> Result<T> requestForResult(HttpMethod httpMethod,String serverName, String uri, Map<String, Object> paramsMap,Object body,Class<T> clazz) throws Exception {Result<T> result = null;
//        try {if (ObjectUtil.isNotEmpty(paramsMap)){StringBuilder sb = new StringBuilder();sb.append(uri+"?");for (Map.Entry entry:paramsMap.entrySet()){sb.append(entry.getKey()+"={"+entry.getKey()+"}"+"&");}uri =sb.substring(0,sb.length()-1).toString();}HttpEntity httpEntity =null;if (ObjectUtil.isNotEmpty(body)){httpEntity = new HttpEntity(body);}if (ObjectUtil.isNull(paramsMap)){paramsMap = new HashMap<>();}ParameterizedTypeReference<Result<T>> responseType = new ParameterizedTypeReference<Result<T>>() {};result = restTemplate2.exchange("http://" + serverName + uri, httpMethod, httpEntity, responseType, paramsMap).getBody();T t = JSONObject.parseObject(JSONObject.toJSONBytes(result.getResult()), clazz);result.setResult(t);
//        }catch (Exception e){
//            e.printStackTrace();
//            log.error(e.getMessage());
//        }return result;}public static <T> Result<List<T>> requestForResultList(HttpMethod httpMethod,String serverName, String uri, Map<String, Object> paramsMap,Object body,Class<T> clazz) throws Exception {Result<List<T>> result = null;
//        try {if (ObjectUtil.isNotEmpty(paramsMap)){StringBuilder sb = new StringBuilder();sb.append(uri+"?");for (Map.Entry entry:paramsMap.entrySet()){sb.append(entry.getKey()+"={"+entry.getKey()+"}"+"&");}uri =sb.substring(0,sb.length()-1).toString();}HttpEntity httpEntity =null;if (ObjectUtil.isNotEmpty(body)){httpEntity = new HttpEntity(body);}if (ObjectUtil.isNull(paramsMap)){paramsMap = new HashMap<>();}ParameterizedTypeReference<Result<List<T>>> responseType = new ParameterizedTypeReference<Result<List<T>>>() {};result = restTemplate2.exchange("http://" + serverName + uri, httpMethod, httpEntity, responseType, paramsMap).getBody();List<T> t = JSONArray.parseArray(JSONObject.toJSONString(result.getResult()), clazz);//        T t = JSONObject.parseObject(JSONObject.toJSONBytes(result.getResult()), clazz);result.setResult(t);
//        }catch (Exception e){
//            e.printStackTrace();
//            log.error(e.getMessage());
//        }return result;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统下关闭Java进程

关闭Java进程具体分为两步&#xff1a; 1.ps查进程ID 2.kill杀进程 具体的命令如下&#xff1a; ps查进程ID&#xff1a;ps -ef | grep java kill杀进程&#xff1a;kill -9 对应进程号 linux下解除被占用的端口号&#xff1a; 1.查看8088端口是否被占用&#xff1a; netsta…

【教程】iOS Swift应用加固

&#x1f512; 保护您的iOS应用免受恶意攻击&#xff01;在本篇博客中&#xff0c;我们将介绍如何使用HTTPCORE DES加密来加固您的应用程序&#xff0c;并优化其安全性。通过以下步骤&#xff0c;您可以确保您的应用在运行过程中不会遭受数据泄露和未授权访问的风险。 摘要 …

PD虚拟机软件下载:在 Mac 上流畅运行 Windows 游戏!

本想一台 MacBook 走天下&#xff0c;奈何有些软件仅提供了 Windows 端&#xff0c;在 macOS 上打不开 EXE 文件&#xff0c;比如炒股软件、会计软件、游戏、工科专业软件等。 由于苹果芯片架构的变化&#xff0c;新款 Mac 想要安装双系统已经不太现实&#xff0c;有没有更简单…

docker 搭建多个Linux系统环境 安装多个不同语言的项目

docker 搭建多个Linux系统环境 安装多个不同语言的项目 宝塔dockers可视化界面 https://blog.51cto.com/u_16213709/9473968

xss.pwnfunction-Jefff

在eval中可以直接执行命令所以直接把"直接闭合在结尾再加上一个"因为后面的"没闭和会报错 ?jeffa";alert(1);" 或 ?jeffa"-alert(1)-" -是分隔符

线段树和树状数组

实战演练 1.【模板】树状数【模板】树状数组1 输入&#xff1a; 5 5 1 5 4 2 3 2 2 4 1 2 3 2 2 3 4 1 1 5 1 2 1 4 注意&#xff1a;只修改一个数&#xff08;单点修改&#xff09;&#xff0c;却要输出一个区间的值&#xff08;区间查询&#xff09;&#xff01;&#xff…

SAP操作教程第14期:SAP B1如何进行自定义字段位置设置

服务对于企业而言永远是重中之重&#xff0c;想要提高服务呼叫效率&#xff0c;员工必须能够快速扫描单据和主数据中的重要信息&#xff0c;及时响应客户。那么&#xff0c;拥有适合企业业务流程的表单则是必不可少的前提。 所以&#xff0c;今天我们就来了解一下&#xff0c;在…

数据库连接查询

一、联合查询 1.使用 union 连接两个 select 语句进行联合查询 select 列 1&#xff0c;列 2... from 表名 where 条件 union select 列 1&#xff0c;列 2... from 表名 where 条 件; select vend_id,prod_id,prod_name,prod_price from products where prod_price < 5…

网络与通信Day1-路由协议

网络协议之路由协议 静态路由&#xff1a; 明细静态 默认静态 动态路由&#xff1a;&#xff08;可以自动去环&#xff09; RIP 十几台或几十台 &#xff08;维护上一代人搭建的网络&#xff09; OSPF 300台 &#xff08;最短路径算法&#xff09; ISIS 1200台 BGP…

学习brpc:echo服务

Echo同步客户端 server 端 #include <gflags/gflags.h> #include <json2pb/pb_to_json.h> #include <brpc/server.h> #include "butil/endpoint.h" #include "echo.pb.h"// flags&#xff0c;用于配置server DEFINE_bool(echo_attachm…

2024.3.27力扣每日一题——统计将重叠区间合并成组的方案数

2024.3.27 题目来源我的题解方法一 排序合并区间快速幂方法二 官方区间合并 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2580 我的题解 方法一 排序合并区间快速幂 先将ranges按第一个元素升序&#xff0c;再按第二个元素升序。然后采用合并区间的方式进行区间合并&…

maya获取所有节点的初始位置

目录 maya获取所有节点的初始位置 获取所有节点的 动画旋转位置 maya获取所有节点的初始位置 import maya.cmds as cmdsdef get_initial_pose(root_node):"""获取根节点及其所有子节点的初始姿态位置。参数:- root_node: 根节点的名称。返回值:- 一个包含节点…

[C++][算法基础]模拟堆(堆)

维护一个集合&#xff0c;初始时集合为空&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个数 x&#xff1b;PM&#xff0c;输出当前集合中的最小值&#xff1b;DM&#xff0c;删除当前集合中的最小值&#xff08;数据保证此时的最小值唯一&#xff09;&…

【云开发笔记NO.23】初步了解CODING-TSF-TKE

CODING-TSF-TKE的集成涉及的是腾讯云的产品。具体来说&#xff1a; CODING-TSF-TKE是腾讯云&#xff0c;腾讯公司提供的云服务。 定义&#xff1a; CODING&#xff1a;是腾讯云旗下一站式DevOps研发管理平台。它提供代码托管、项目协同、测试管理、持续集成、制品库、持续部署…

UE小:UE5.3无法创建C++工程

当您在使用Unreal Engine (UE) 构建项目时&#xff0c;如果遇到以下问题&#xff1a; Running C:/Program Files/Epic Games/UE\_5.3/Engine/Build/BatchFiles/Build.bat -projectfiles -project"C:/UEProject/Shp\_1/Shp\_1.uproject" -game -rocket -progress Usi…

如何在JavaScript中提高性能

在JavaScript中提高性能是一个涉及多个方面的任务&#xff0c;包括代码优化、数据结构选择、异步编程、避免全局查找、内存管理等。以下是一些关键的策略和技巧&#xff0c;可以帮助你提高JavaScript代码的性能&#xff1a; 1. 优化循环 使用for循环代替forEach&#xff0c;特…

设计模式:责任链模式

责任链模式是一种行为设计模式,允许你将请求沿着一条链传递,直到一个对象处理它为止。这种模式包含了一些处理对象,每个对象都包含逻辑来处理特定类型的命令或请求。如果一个对象不能处理该请求,它就会将请求传递给链中的下一个对象,如此类推。 定义 责任链模式通过定义…

python之正则表达式(2)

1、贪婪量词和懒惰量词 贪婪量词&#xff1a;也就是尽可能多的匹配字符 懒惰量词&#xff1a;尽可能少的匹配字符&#xff08;在现在的计算机语言中大多默认为贪婪量词若想要使用 懒惰量词就需要在后面加上&#xff1f;即可&#xff09; 代码示例&#xff1a; import rep …

JavaScript - 你遇到过哪几种Javascript的错误类型

难度级别:中级及以上 提问概率:50% 我们在开发Javascript代码的时候,经常一不小心就会遇到各种各样的异常,浏览器也会及时给出错误信息,那么一般会遇到哪几种异常情况呢,我们来看一下。 1 ReferenceError错误 ReferenceError几乎是最…

代码随想录训练营day29

第七章 回溯算法 part05 1.LeetCode. 递增子序列 1.1题目链接&#xff1a;491.递增子序列 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;B站卡哥视频 1.2思路&#xff1a;这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。这又是子集&a…