restTemplate实现http远程调用

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/*** @description 将RestTemplate注入到容器当中,让他保持单例,当我们哪个类要使用的时候直接从容器里面获取即可。这样可以避免每调用一次创建一个RestTemplate对象*/
@Configuration
public class ApplicationContextBean {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

先注入单列模式

http发送get请求和POST2种请求方式

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.cdtye.common.core.utils.StringUtils;import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;@Component
@Slf4j
public class HttpUtils {@Resourceprivate RestTemplate restTemplate;private static HttpUtils httpUtils;@PostConstructpublic void init(){httpUtils = this;httpUtils.restTemplate = this.restTemplate;}public static <T> String sendGetRequest(String url,String token, Map<String, Object> queryParams) {return getRequest(url, token,HttpMethod.GET, queryParams);}public static <T> String sendPostRequest(String url,String token, Map<String, Object> queryParams,Integer type) {return postRequest(url, token,queryParams,type);}public static <T> String getRequest(String url,String token, HttpMethod method, Map<String, Object> queryParams) {HttpHeaders headers = new HttpHeaders();//是否携带tokenif (StringUtils.isNotEmpty(token)){headers.add(HttpHeaders.AUTHORIZATION, "Bearer "+token);}if (queryParams != null && !queryParams.isEmpty()) {StringBuilder urlBuilder = new StringBuilder(url);urlBuilder.append("?");for (Map.Entry<String, Object> entry : queryParams.entrySet()) {urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");}url = urlBuilder.toString();}HttpEntity<String> requestEntity = new HttpEntity<>(headers);ResponseEntity<String> responseEntity = httpUtils.restTemplate.exchange(url, method, requestEntity,String.class);return responseEntity.getBody();}/*** @description type 1 contentType:application/x-www-form-urlencoded  2contentType:application/json(使用了@RequestBody接收参数)*/public static <T> String postRequest(String url,String token,Map<String, Object> queryParams,Integer type) {String result = "";HttpHeaders headers = new HttpHeaders();//是否携带tokenif (StringUtils.isNotEmpty(token)){headers.add(HttpHeaders.AUTHORIZATION, "Bearer "+token);}//post 请求2种方式if (Objects.equals(type,1)){headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();for (String key : queryParams.keySet()) {map.add(key,queryParams.get(key));}HttpEntity<MultiValueMap<String,Object>> formEntity = new HttpEntity<>(map, headers);result = httpUtils.restTemplate.postForObject(url, formEntity, String.class);}if (Objects.equals(type,2)){headers.setContentType(MediaType.APPLICATION_JSON);String params = JSON.toJSONString(queryParams);HttpEntity<String> formEntity = new HttpEntity<>(params, headers);result = httpUtils.restTemplate.postForObject(url, formEntity, String.class);}return result;}/*** 发送包含文件的表单数据的POST请求** @param data 表单数据,JSON格式的字符串* @param url  目标URL* @param file 要上传的文件*/public static String formDataSendPost(String data, String url,String fileKey,File file) {OkHttpClient okHttpClient = new OkHttpClient();String responseBody = null;try {// 创建Multipart请求体MultipartBody.Builder requestBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);// 添加文本参数com.alibaba.fastjson2.JSONObject jsonObject = JSONObject.parseObject(data);for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {requestBodyBuilder.addFormDataPart(entry.getKey(), entry.getValue().toString());}// 添加文件参数if (file != null) {String fileName = file.getName();RequestBody fileBody = RequestBody.create(okhttp3.MediaType.parse("application/octet-stream"), file);requestBodyBuilder.addFormDataPart(fileKey, fileName, fileBody);}RequestBody requestBody = requestBodyBuilder.build();// 创建请求Request request = new Request.Builder().url(url).post(requestBody).build();// 发送请求并获取响应Response response = okHttpClient.newCall(request).execute();if (response.isSuccessful()) {responseBody = response.body().string();log.info("数据发送成功:" + responseBody);} else {responseBody = "数据发送失败:" + response.code() + " " + response.message();log.error("数据发送失败:" + response.code() + " " + response.message());}} catch (IOException e) {e.printStackTrace();}return responseBody;}
}

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

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

相关文章

树莓派下,docker中安装部署TensorFlow java版本

在树莓派上安装和部署TensorFlow Java版本需要一些特定的步骤,尤其是当你打算使用Docker容器来运行它时。以下是详细的步骤,帮助你在树莓派上完成这一任务。 一、准备工作 确保你的树莓派操作系统已更新,并安装了Docker。如果尚未安装,使用以下命令进行安装和更新: sud…

C++学习第四天

文章目录 1. 存储变量值的内存2. 声明并初始化指针3.引用运算符4. 解除引用运算符 1. 存储变量值的内存 /* - 指针是一个变量&#xff0c;与所有变量一样&#xff0c;指针也占用内存空间- 指针的特殊之处在于&#xff0c;指针包含的值&#xff08;这里为0x558&#xff09;被解…

【计算机网络】OSPF单区域实验

一&#xff1a;实验目的 1&#xff1a;掌握在路由器上配置OSPF单区域。 2&#xff1a;学习OSPF协议的原理&#xff0c;及其网络拓扑结构改变后的变化。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。…

Vue 3 实现左侧列表点击跳转滚动到右侧对应区域的功能

使用 Vue 3 实现左侧列表点击跳转到右侧对应区域的功能 1. 引言 在这篇博客中&#xff0c;我们将展示如何使用 Vue 3 实现一个简单的页面布局&#xff0c;其中左侧是一个列表&#xff0c;点击列表项时&#xff0c;右侧会平滑滚动到对应的内容区域。这种布局在很多应用场景中都…

Llama 3.1 405B 详解

2024 年 7 月 23 日星期二&#xff0c;Meta 宣布推出 Llama 3.1&#xff0c;这是其Llama 系列大型语言模型 (LLM)的最新版本。虽然只是对 Llama 3 模型进行小幅更新&#xff0c;但它特别引入了Llama 3.1 405B——一个 4050 亿参数的模型&#xff0c;这是迄今为止世界上最大的开…

力扣刷题录——链表

一、移除链表元素 移除链表元素 法一&#xff1a;不使用虚拟头节点 ListNode* removeElements(ListNode* head, int val) {//若删除头节点while(head!NULL&&head->valval)//连续删除头节点的条件{headhead->next;} //删除其他节点&#xff08;先判断是不是空链…

【Qt 关于信号和槽 的参数类型和参数顺序关系】

前言&#xff1a;信号的参数类型和参数顺序一定要严格要求并且指明&#xff08;特别是当同一信号会发出不同参数类型和顺序的信号时&#xff09;&#xff0c;槽会根据参数类型和参数顺序进行匹配相应的槽函数&#xff0c;期间槽函数的自动类型匹配也可以生效。 信号定义&#x…

运行ruoyi

nacos 数据库配置 修改nacos/conf/application.properties 单机版运行 startup.cmd -m standalone redis 运行后端 运行gateway,auth,modules/system模块 可能遇到的问题&#xff1a;端口正在使用 解决 netstat -ano | findstr 9200 taskkill -pid 18284 -f

JAVA同城圈子达人交友系统源码支持微信小程序+公众号+H5+APP

&#x1f308; 同城圈子达人交友系统&#xff0c;遇见志同道合的TA&#xff01; &#x1f389; 开篇&#xff1a;告别孤单&#xff0c;同城圈子等你来探索&#xff01; 在这个快节奏的城市生活中&#xff0c;你是否常常感到孤独&#xff0c;渴望找到一群志同道合的朋友&#…

发现洗白的公开伎俩

利益方把事件A和事件B放在一起&#xff0c;事件A和事件B有明显逻辑冲突&#xff0c;故意把A和B在一起炒大。一段时间就有人利用逻辑冲突来故意辟谣&#xff0c;把事件真实全部否定&#xff0c;达到舆论上既没有做A或其相关事项&#xff0c;也没有做B或其相关事项的目的&#xf…

Elasticsearch基础(六):使用Kibana Lens进行数据可视化

文章目录 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 二、基础可视化 1、指标可视化 2、垂直堆积条形图 3、表格 三、高级可视化 1、多图层和索引 2、子桶 3、树状图 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 在Kibana主页&#xff0c;单击页面…

【资料分享】2024钉钉杯大数据挑战赛A题思路解析+代码演示

2024第三届钉钉杯大学生大数据挑战赛今天已经开赛&#xff0c;【A题】思路解析代码&#xff0c;资料预览&#xff1a;

Conda的守护神:包兼容性测试全指南

Conda的守护神&#xff1a;包兼容性测试全指南 在软件开发中&#xff0c;确保不同软件包之间的兼容性是维护项目稳定性的关键。Conda&#xff0c;作为广泛使用的包管理器和环境管理器&#xff0c;提供了强大的工具来测试包的兼容性。本文将深入探讨如何在Conda中使用包兼容性测…

使用 Java 监听和处理 POST 请求

各类学习教程下载合集 ​​https://pan.quark.cn/s/874c74e8040e​​ 在现代 Web 开发中&#xff0c;监听和处理 HTTP POST 请求是常见的任务之一。无论是构建 RESTful API 还是处理表单提交&#xff0c;Java 都提供了强大的工具和库来实现这一功能。本文将介绍如何使用 Java…

【JAVA学习笔记】找不到依赖项 ‘org.springframework.boot:spring-boot-starter-web:3.0.5‘

如果环境都是跟着教程配的话&#xff0c;并且上网搜了一圈询问gpt都没发现对应长得像的错误&#xff0c;那么试试**刷新一下Maven项目**&#xff0c;可能问题就自己解决了。如果这样解决不了再查到底是什么地方没有配置对。&#xff08;我第一次遇到这个问题的时候搜了半天都不…

RHEL8.6配置yum仓库

记录通过Linux安装ISO挂载yum仓库&#xff0c;由于没有在线仓库只能挂载iso的软件仓库 [rootlocalhost /]# yum install libicu 正在更新 Subscription Management 软件仓库。 无法读取客户身份本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。错误&…

遇到 chunk of umi not found 处理办法

1、删除 以下文件 &#xff08;1&#xff09;node_modules 其中快速删除node_modules方法可参考&#xff1a;rimraf快速删除node_modules方法-CSDN博客文章浏览阅读258次。rimraf快速删除node_modules方法https://blog.csdn.net/2401_85955297/article/details/140566245?spm…

md,感觉enable_if的推导过程又迷糊了。这次好像又清晰了一些

通过这几个例子&#xff0c;暂时有个结论&#xff1a; 基本就是&#xff1a;由泛型版本定下参数列表里的参数&#xff0c; 编译成功&#xff1a;template<bool _Test, class _Ty void> struct enable_if123;template<class _Ty> struct enable_if123<true, _T…

微信小游戏之 三消(一)

首先设定一下 单个 方块 cell 类&#xff1a; 类定义和属性 init 方法 用于初始化方块&#xff0c;接收游戏实例、数据、宽度、道具类型和位置。 onWarning 方法 设置警告精灵的帧&#xff0c;并播放闪烁动作&#xff0c;用于显示方块的警告状态。 grow 方法 根据传入的方向…

网络基础之(11)优秀学习资料

网络基础之(11)优秀学习资料 Author&#xff1a;Once Day Date: 2024年7月27日 漫漫长路&#xff0c;有人对你笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的博客-CSDN博客。 参考文档&#xff1a; 网络工程初学者的学习方法及成长之路&#xff08;红…