从0开始搭建一个生产级SpringBoot2.0.X项目(六)RestTemplate调用第三方接口

news2024/11/22 16:12:12

前言

最近有个想法想整理一个内容比较完整springboot项目初始化Demo。

SpringBoot使用RestTemplate由服务端向外发起网络请求

一、将RestTemplate配置初始化为一个Bean

修改RestTemplate默认的客户端,例如将其改成HttpClient客户端

package com.murg.bootdemo.config;

import com.murg.bootdemo.interceptor.HeaderRequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class RestClientConfig {

    @Bean
    public ClientHttpRequestFactory clientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(180000);//设置连接超时时间
        factory.setReadTimeout(180000);//读取超时时间
        return factory;
    }

    /**
     * DependsOn注解用于确保所使用的bean已被初始化
     * @param clientHttpRequestFactory 设置
     * @return org.springframework.web.client.RestTemplate
     */
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
        List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(new HeaderRequestInterceptor());
        RestTemplate restTemplate =  new RestTemplate(clientHttpRequestFactory);
        restTemplate.setInterceptors(interceptors);
        return restTemplate;
//        //配置HTTP超时时间
//        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(
//                HttpClientBuilder.create()
//                        .setMaxConnTotal(100)//最大连接池
//                        .setMaxConnPerRoute(50)//每个池最大连接数
//                        .build());
//        httpRequestFactory.setConnectTimeout(120000);
//        httpRequestFactory.setReadTimeout(180000);
//        return new RestTemplate(httpRequestFactory);
    }

}

二、使用RestTemplate

TestRestController 注入 RestTemplate

新增测试/rest/authenticate 接口  通过RestTemplate方式获取token

 @RequestMapping(value = "/rest/authenticate", method = RequestMethod.GET)
    public WebResult restAuthenticate(){
        String url = "http://127.0.0.1:8081/api/authenticate";
        // 由于获取student接口咱们设置了basicauth,所以需要在请求时配置
        HttpHeaders headers = new HttpHeaders();
        // 需要传递FORMDATA的请求参数
        headers.setContentType(MediaType.APPLICATION_JSON);
        Map params =new HashMap();
        params.put("username", "admin");
        params.put("password", "123456");
        params.put("clientid", "clientid");
        HttpEntity httpEntity = new HttpEntity(params, headers);
        ResponseEntity<WebResult> response = null;
        try {
            // 通过POST方式调用接口,如果需要PUT,DELETE方式调用
            // 只需要修改为HttpMethod.PUT,HttpMethod.DELETE即可,其他传递参数已经代码一致
            response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, WebResult.class);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return response.getBody();
    }

三、自定义HeaderRequestInterceptor拦截器

自定义HeaderRequestInterceptor继承ClientHttpRequestInterceptor的拦截器。处理Header信息,此处增加接口访问时间打印

package com.murg.bootdemo.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;

import java.io.IOException;

/**
 * @version 1.0
 * @Description: 给不同的请求地址 添加不同的header
 */
@Slf4j
public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        long startTime = System.currentTimeMillis();
        ClientHttpResponse response= null;
        try {
            response = execution.execute(request, body);
        } catch (IOException e) {
           throw e;
        }finally {
            long endTime = System.currentTimeMillis();
            long duration = endTime - startTime;
            log.info("Request URL: " + request.getURI() + " 耗时 " + duration + "ms");
        }
        return response;
    }
}

四、postman测试

控制台打印耗时

 [Request URL: http://127.0.0.1:8081/api/authenticate 耗时 10ms]

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

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

相关文章

Cyber​​Panel filemanager/upload 远程命令执行漏洞复现

0x01 产品简介 CyberPanel是一个开源的Web控制面板,它提供了一个用户友好的界面,用于管理网站、电子邮件、数据库、FTP账户等。CyberPanel旨在简化网站管理任务,使非技术用户也能轻松管理自己的在线资源。 0x02 漏洞概述 该漏洞源于filemanager/upload接口未做身份验证和…

Qt开发————网络编程

目录 Socket套接字 IP地址 端口号 IP地址与端口号的组合 MAC地址的特征 MAC地址的作用 重要性 例子 TCP/UDP协议 TCP UDP 网络编程1.0-----网络与通信介绍_计算机网络与通信网络csdn-CSDN博客 Socket套接字 IP地址 IP地址&#xff08;Internet Protocol Address&…

Spring Cloud Sleuth(Micrometer Tracing +Zipkin)

分布式链路追踪 分布式链路追踪技术要解决的问题&#xff0c;分布式链路追踪&#xff08;Distributed Tracing&#xff09;&#xff0c;就是将一次分布式请求还原成调用链路&#xff0c;进行日志记录&#xff0c;性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节…

ARM base instruction -- bic

Bitwise Bit Clear (shifted register) performs a bitwise AND of a register value and the complement of an optionally-shifted register value, and writes the result to the destination register. 位清除&#xff08;移位寄存器&#xff09;执行寄存器值与可选移位寄存…

【动手学运动规划】 3.3 确定性采样:基于控制空间采样

要往前走&#xff0c;就得先忘掉过去。 —《阿甘正传》 &#x1f3f0;代码及环境配置&#xff1a;请参考 环境配置和代码运行! 确定性采样运动规划是一种采用确定性采样策略进行运动规划的方法。它通过按照预定规则生成采样点来构建解空间&#xff0c;并用于后续的路径搜索或…

深入理解Java虚拟机(五)

介绍对象的标记算法及引用详解 1、引用计数器 引用计数器在对象中添加一个引用计数器&#xff0c;当一个地方引用的时候&#xff0c;计数器1&#xff0c;当引用失效时&#xff0c;计数器值就-1。 但是在Java里面存在对象循环引用&#xff1a;objA 和 objB都有字段instance&a…

Javaee:阻塞队列和生产者消费者模型

文章目录 什么是阻塞队列java中的主要阻塞队列生产者消费者模型阻塞队列发挥的作用解耦合削峰填谷 模拟实现阻塞队列put方法take方法生产者消费者模型 什么是阻塞队列 阻塞队列是一种支持阻塞操作的队列&#xff0c;在多线程中实现通线程之间的通信协调的特殊队列 java中的主…

git仓库分支

操作 切换分支 git checkout 1.2.5 git checkout 1.3.0 使用命令切换分支之后&#xff0c;代码内容加载过后也是切换好的

安卓基础001

前言 也是好久没有更新博客了,最近实习也是需要学习一些知识哈哈哈哈哈哈为了更好的发展嘛,咱们从客户端开始,过程可能有点像写前端,不喜勿喷,希望在学习的过程中也可以给大家带来一些简单得帮助吧....... tips:这里跳过安卓studio安装,大家可自行寻找教程 写的不详细,只是为了…

使用web.dev提供的工具实现浏览器消息推送服务

文章目录 前言实现工具和效果实现原理实现过程前端接收用户订阅请求将用户订阅信息更新到后端后端实现接收并保存订阅信息的接口后端实现消息推送的逻辑前言 对于电商独立站来说,新品上架或者促销活动上线及时通知到用户是很重要的,通知的渠道有很多,其中就包括浏览器消息推…

在Bash脚本中 set -e 是什么意思

问题 我正在研究这个预安装(preinst)脚本的内容&#xff0c;该脚本会在从 Debian 软件包(.deb)文件解压该包之前执行。 脚本包含以下代码&#xff1a; #!/bin/bash set -e # Automatically added by dh_installinit if [ "$1" install ]; thenif [ -d /usr/share…

服务器宝塔安装哪吒监控

哪吒文档地址&#xff1a;https://nezha.wiki/guide/dashboard.html 一、准备工作 OAuth : 我使用的gitee&#xff0c;github偶尔无法访问&#xff0c;不是很方便。第一次用了极狐GitLab&#xff0c;没注意&#xff0c;结果是使用90天&#xff0c;90天后gg了&#xff0c;无法登…

JavaEE初阶---网络原理(四)--IP协议/DNS协议

文章目录 1.初识网络层&#xff08;了解即可&#xff09;2.地址管理2.1动态分配2.2网络地址转换2.3IP-v6最终解 3.网段划分4.以太网协议--数据链路层5.DNS应用层协议 1.初识网络层&#xff08;了解即可&#xff09; 网络层做的事情就是下面的两个&#xff1a; 1&#xff09;地…

邮件发送excel带预览excel功能

excel 打开后的内容: 思路&#xff1a; 1、邮件发送excel 是作为附件发送出去的&#xff1b; 2、excel 预览是&#xff0c;必须另外点击预览按钮&#xff0c;并不能直接预览邮件内容然后在邮件主体内容展示出来 根据以上两点基本没法实现 邮件发送后邮件自带 预览功能。 伪方法…

Spring Boot 3 + Spring Security + Knife4j 无法访问 Swagger 文档的问题及解决方案

背景介绍 在使用Spring Boot 3框架结合Spring Security进行项目开发时&#xff0c;我们可能会遇到集成Knife4j后Swagger文档无法正常访问的情况。本文将探讨可能的原因以及相应的解决办法。 常见问题 问题描述 当配置好Spring Security后尝试通过Knife4j访问API文档页面时&…

构建校园社团信息管理平台:Spring Boot技术的核心要点

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

Spring 框架中常见的注解(Spring、SpringMVC、SpringBoot)

1. Spring 中常见注解 还有Recourse&#xff1a;相当于AutowiredQualifier Value : 用于将配置文件中的值注入到Bean的字段中。 Bean : 用于在配置类中声明一个Bean。 Lazy : 用于延迟加载Bean。 2. SpringMVC 中常见注解 还有GetMapping PostMapping PutMapping DeleteMapp…

深度学习笔记之BERT(一)BERT的基本认识

深度学习笔记之BERT——BERT的基本认识 引言回顾&#xff1a;Transformer的策略回顾&#xff1a;Word2vec的策略和局限性 BERT \text{BERT} BERT的基本理念抽象的双向BERT的预训练策略 预训练与微调 引言 从本节开始&#xff0c;将介绍 BERT \text{BERT} BERT系列模型以及其常…

【华为HCIP实战课程二十八】中间到中间系统协议IS-IS邻居关系排错,网络工程师

一、ISIS邻居关系条件 1、同一层次(比如Level-2路由器不能和Level-1路由器形成邻居关系) 2、同一区域(L1必须同一区域) 3、同一网段 R1和R2之间分别配置如下IP地址和掩码: R1 的接口S1/0/0掩码为/24 R2的接口S1/0/0配置成掩码/28: 此时R1和R2依然可以建立ISIS邻居关系…

微信小程序,打开新的项目,调试遇见[ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json

1&#xff0c;首先&#xff0c;在开发工具右上角&#xff0c;打开详情&#xff1b;设置基础库&#xff1b;3.6.3 2&#xff0c;第二步&#xff0c;在项目目录下&#xff0c;找到app.json文件存在 3&#xff0c;第三步&#xff0c;修改项目根目录下&#xff0c;project.config.j…