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.lang.NumberFormatException异常解决方案详解

    java.lang.NumberFormatException异常解决方案详解

    这篇文章主要介绍了java.lang.NumberFormatException异常解决方案详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java中拼接字符串String的N种方法总结

    Java中拼接字符串String的N种方法总结

    字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起,下面这篇文章主要给大家介绍了关于Java中拼接String的N种方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Java经典面试题汇总:JVM

    Java经典面试题汇总:JVM

    本篇总结的是JVM相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢
    2021-07-07
  • Java桥接模式原理及用法解析

    Java桥接模式原理及用法解析

    这篇文章主要介绍了Java桥接模式原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java数组(Array)最全汇总(上篇)

    Java数组(Array)最全汇总(上篇)

    这篇文章主要介绍了Java数组(Array)最全汇总(上篇),本文章内容详细,通过案例可以更好的理解数组的相关知识,本模块分为了三部分,本次为上篇,需要的朋友可以参考下
    2023-01-01
  • Java二维数组实现数字拼图效果

    Java二维数组实现数字拼图效果

    这篇文章主要为大家详细介绍了Java二维数组实现数字拼图效果,控制台可以对空格进行移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java递归算法经典实例(经典兔子问题)

    Java递归算法经典实例(经典兔子问题)

    本文主要对经典的兔子案例分析,来进一步更好的理解和学习java递归算法,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • springmvc多事务提交和回滚问题

    springmvc多事务提交和回滚问题

    本文介绍了Spring MVC中如何配置和使用多事务管理及回滚,重点内容包括配置jdbc.properties文件,使用Spring Framework 5.3版本新增的CompositeTransactionManager,以及如何在相关方法上添加@Transactional注解
    2024-09-09
  • java 中线程等待与通知的实现

    java 中线程等待与通知的实现

    这篇文章主要介绍了java 中线程等待与通知的实现的相关资料,希望通过本文能帮助到大家,让大家掌握这样的功能,需要的朋友可以参考下
    2017-09-09
  • Java8对List排序的方法大全

    Java8对List排序的方法大全

    这篇文章主要给大家介绍了关于Java8对List排序的方法大全,其实Java针对数组和List的排序都有实现,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07

最新评论