开发者

RestTemplate报错400 Bad Request的解决方案

开发者 https://www.devze.com 2024-11-08 10:33 出处:网络 作者: 夏诗曼CharmaineXia
目录RestTemplate报错400 Bad Request问题所在解决办法方法1方法2:写个config类总结RestTephpmplate报错400 Bad Request
目录
  • RestTemplate报错400 Bad Request
  • 问题所在
  • 解决办法
    • 方法1
    • 方法2:写个config类
  • 总结

    RestTephpmplate报错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> ent编程客栈ity = new HttpEntity<>(body, httpHeaders);
                FeishuAlarmResp result = restTemplate.postF编程客栈orObject(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 RestTemplapythonte 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(pythonStandardCharsets.UTF_8);
                }
            });
            return restTemplate;
        }
    }

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号