当前位置: 首页 > news >正文

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;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 八股文”在实际工作中是助力、阻力还是空谈?
  • git实践汇总【配置+日常使用+问题解决】
  • three.js中加载ply格式的文件,并使用tween.js插件按照json姿态文件运动
  • vue项目上线打包后出现的问题
  • 实战之oss附件批量下载---springboot 实现压缩阿里云oss附件并下载
  • shapeit填充
  • 免费好用的 CI/CD 工具有哪些?
  • C++ //练习 16.6 你认为接受一个数组实参的标准库函数begin和end是如何工作的?定义你自己版本的begin和end。
  • CSP:内容安全策略的前端深入解析
  • SeaCMS海洋影视管理系统远程代码执行漏洞复现
  • 经典文献阅读之--GraphAD(端到端自动驾驶的交互场景图)
  • 【笔记:3D航路规划算法】二、RRT*
  • UnityShaderUI编辑器扩展
  • 手撕数据结构---栈和队列的概念以及实现
  • go语言怎么实现dataauth?
  • 【RocksDB】TransactionDB源码分析
  • Bytom交易说明(账户管理模式)
  • CODING 缺陷管理功能正式开始公测
  • es6
  • ES6 学习笔记(一)let,const和解构赋值
  • JAVA并发编程--1.基础概念
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • npx命令介绍
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 初探 Vue 生命周期和钩子函数
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 检测对象或数组
  • 入门到放弃node系列之Hello Word篇
  • 数据结构java版之冒泡排序及优化
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Java数据解析之JSON
  • Spring Batch JSON 支持
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​MySQL主从复制一致性检测
  • ​业务双活的数据切换思路设计(下)
  • #数据结构 笔记三
  • (1)bark-ml
  • (SpringBoot)第二章:Spring创建和使用
  • (超详细)语音信号处理之特征提取
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (算法)前K大的和
  • *Django中的Ajax 纯js的书写样式1
  • .NET 8 跨平台高性能边缘采集网关
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET是什么
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [001-03-007].第07节:Redis中的管道
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心