RestTemplate报错400 Bad Request的解决方案

 更新时间:2024年11月08日 08:58:25   作者:夏诗曼CharmaineXia  
在使用Spring Boot时,若直接通过@Autowired注入RestTemplate可能会遇到400BadRequest错误,原因在于Spring Boot官方文档指出,由于RestTemplate实例通常需要在使用前进行定制,因此Spring Boot不会自动配置单个RestTemplate Bean

RestTemplate报错400 Bad Request

使用RestTemplate发送http请求,发现报错400 Bad Request,其实这是个很基础的问题,一般都能绕过去,像我这样直接复制代码才有可能发生这样的错误情况。

先上原码:

    @Autowired
    RestTemplate restTemplate;

    public boolean alarm(String url,String body) {
            if (body == null || url == null) {
                return false;
            }
        try {
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.add(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());

            HttpEntity<String> entity = new HttpEntity<>(body, httpHeaders);
            FeishuAlarmResp result = restTemplate.postForObject(url, entity, FeishuAlarmResp.class);
            if (result == null || result.getStatusCode() == null || result.getStatusCode() != 0) {
                log.error("http发送失败>>>>>>result={} message={}",JSON.toJSONString(result),body);
                return false;
            }
        } catch (Throwable t) {
            log.error("http发送异常:url:" + url + ",body:" + body, t);
            return false;
        }
        return true;
    }

直接报错:

org.springframework.web.client.HttpClientErrorException: 400 Bad Request

问题所在

不能直接使用 @Autowired 自动注入 RestTemplate 使用。

因为,官网文档有写:

Since RestTemplate instances often need to be customized before being used, Spring Boot does not provide any single auto-configured RestTemplate bean.

(由于RestTemplate实例在使用前通常需要定制,Spring Boot不提供任何单个自动配置的RestTemplate bean。)

解决办法

自定义RestTemplate的Bean对象,重点是要用restTemplateBuilder.build()来创建对象。

方法1

@Autowired
private RestTemplateBuilder restTemplateBuilder;
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate getRestTemplate() {
    return restTemplateBuilder.build();
}

//调用方式:
String baiduHtml = restTemplate.getForObject("https://www.baidu.com", String.class);
System.out.println(baiduHtml);

方法2:写个config类

然后就可以用 @Autowired 自动注入 RestTemplate 使用了。

@Component
public class RestTemplateConfig {


    /**
     * RestTemplate
     * @return RestTemplate
     */
    @Bean
    public RestTemplate restTemplate() {
        return getRestTemplate();
    }

    /**
     * 获取自定义 RestTemplate
     * @return RestTemplate
     */
    private RestTemplate getRestTemplate() {
        RestTemplate restTemplate = new RestTemplateBuilder()
                .setConnectTimeout(5 * 1000)
                .setReadTimeout(60 * 1000)
                .build();
        // 为避免汉字变成问号,将String转换器编码格式置为 UTF-8
        restTemplate.getMessageConverters().forEach(converter -> {
            if (converter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
            }
        });
        return restTemplate;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用过滤器防止SQL注入XSS脚本注入的实现

    Java使用过滤器防止SQL注入XSS脚本注入的实现

    这篇文章主要介绍了Java使用过滤器防止SQL注入XSS脚本注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Springmvc conver实现原理及用法解析

    Springmvc conver实现原理及用法解析

    这篇文章主要介绍了Springmvc conver实现原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 一篇文章带你深入了解Java类加载

    一篇文章带你深入了解Java类加载

    这篇文章主要介绍了Java中类加载过程全面解析,具有一定参考价值,需要的朋友可以了解下,希望能给你带来帮助
    2021-08-08
  • Mybatis中如何映射mysql中的JSON字段

    Mybatis中如何映射mysql中的JSON字段

    在mapper.xml中,需要在字段映射时加入typeHandler,具体:<id property="abnormalEigenList" column="AbnormalEigen" typeHandler="com.xxx.config.JsonHandler">,下面通过本文给大家介绍Mybatis中,映射mysql中的JSON字段,需要的朋友可以参考下
    2023-10-10
  • java设计优化之单例模式

    java设计优化之单例模式

    这篇文章主要为大家详细介绍了java设计优化中的单例模式,深入学习java单例模式,感兴趣的朋友可以参考一下
    2016-03-03
  • Java结构型设计模式中代理模式示例详解

    Java结构型设计模式中代理模式示例详解

    代理模式(Proxy Parttern)为一个对象提供一个替身,来控制这个对象的访问,即通过代理对象来访问目标对象。本文将通过示例详细讲解一下这个模式,需要的可以参考一下
    2022-09-09
  • Java使用FutureTask实现预加载的示例详解

    Java使用FutureTask实现预加载的示例详解

    基于FutureTask的特性,通常可以使用FutureTask做一些预加载工作,比如一些时间较长的计算等,本文就来和大家讲讲具体实现方法吧,感兴趣的可以了解一下
    2023-06-06
  • Spring Cloud Feign统一设置验证token实现方法解析

    Spring Cloud Feign统一设置验证token实现方法解析

    这篇文章主要介绍了Spring Cloud Feign统一设置验证token实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java实现简单的验证码功能

    java实现简单的验证码功能

    这篇文章主要为大家详细介绍了java实现简单的验证码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • SpringBoot HikariCP配置项及源码解析

    SpringBoot HikariCP配置项及源码解析

    这篇文章主要为大家介绍了SpringBoot HikariCP配置项及源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论