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

总结

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

相关文章

  • linux用java -jar启动jar包缓慢的问题

    linux用java -jar启动jar包缓慢的问题

    这篇文章主要介绍了linux用java -jar启动jar包缓慢的问题,具有很好的参考价值,希望对大家有所帮助,
    2023-09-09
  • 举例讲解Java的内部类与类的加载器

    举例讲解Java的内部类与类的加载器

    这篇文章主要介绍了Java的内部类与类的加载器,是Java入门学习中的基础知识,需要的朋友可以参考下
    2016-03-03
  • Assert.assertEquals的使用方法及注意事项说明

    Assert.assertEquals的使用方法及注意事项说明

    这篇文章主要介绍了Assert.assertEquals的使用方法及注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 提升性能秘密武器Java Unsafe类面试精讲

    提升性能秘密武器Java Unsafe类面试精讲

    这篇文章主要为大家介绍了提升性能秘密武器Java Unsafe类面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Spring Security OAuth2认证授权示例详解

    Spring Security OAuth2认证授权示例详解

    这篇文章主要介绍了Spring Security OAuth2认证授权示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Java Deque基本概念和使用方法

    Java Deque基本概念和使用方法

    Deque双端队列是Java Collections Framework的一部分,支持在两端插入和删除操作,它继承自Queue接口,可以作为队列FIFO或栈LIFO使用,本文介绍java Deque基本概念和使用方法,感兴趣的朋友一起看看吧
    2025-03-03
  • Java concurrency之公平锁(一)_动力节点Java学院整理

    Java concurrency之公平锁(一)_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java concurrency之公平锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java中的世界时区如何自动计算及生成?

    Java中的世界时区如何自动计算及生成?

    在 Java 中,处理时区和时间计算是一个非常常见的需求,尤其是在涉及全球应用时,Java 提供了一些强大的 API 来处理世界时区(如 java.time 包),下面将介绍如何基于 Java 自动计算时区并生成相应的时间
    2025-01-01
  • Spring中@Configuration注解的使用场景

    Spring中@Configuration注解的使用场景

    这篇文章主要介绍了Spring中@Configuration注解的使用场景,@Configuration注解是从Spring 3.0版本开始加入的一个使Spring能够支持注解驱动开发的标注型注解,主要用于标注在类上,需要的朋友可以参考下
    2023-11-11
  • springboot maven plugin报红的解决办法

    springboot maven plugin报红的解决办法

    本文主要介绍了springboot maven plugin报红的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论