Spring RestTemplate to POST 请求,具有自定义标头和请求对象

2022-09-02 14:20:14

在Spring RestTemplate中,有一种方法可以将自定义标头与POST请求对象一起发送。我已经尝试了可用的方法。似乎我们可以将键值对与自定义标头一起发送,但不能将请求对象本身附加到以下代码演示尝试,并且它似乎适用于服务器。exchangeHttpEntity.400 BadRequest

    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.setContentType(MediaType.APPLICATION_JSON);

    HttpEntity<?> httpEntity = new HttpEntity<Object>(requestDTO, requestHeaders);

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.exchange(URL, HttpMethod.POST, httpEntity, SomeObject.class);

有人知道这种情况吗?还是我尝试做的事情是不可能的?


答案 1

是的,如果使用多值地图标头而不是 HttpHeaders,这是可能的

例:

MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("Authorization", "Basic " + base64Creds);
headers.add("Content-Type", "application/json");

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

HttpEntity<ObjectToPass> request = new HttpEntity<ObjectToPass>(objectToPassInstance, headers);

restTemplate.postForObject(urlPost, request, Boolean.class);

布尔值.class只是因为我的控制器在此终结点处返回布尔值(可以是任何内容)

祝您编码好运!


答案 2
  1. 尝试启用Spring软件包的完全调试。我相信你会得到更多关于你的“400错误请求”的信息:

    <logger name="org.springframework">
        <level value="DEBUG"/>
    </logger>
    
  2. 尝试使用任何 rest 工具(例如 Rest Console Chrome 插件)发送相同的请求。

  3. 查看浏览器调试控制台上发生的情况(例如,Chrome 的“网络”标签)。

这些步骤总是帮助我。