【问题标题】:Spring RestTemplate to POST request with Custom Headers and a Request ObjectSpring RestTemplate 使用自定义标头和请求对象发布请求
【发布时间】:2014-03-10 11:57:21
【问题描述】:

在 Spring RestTemplate 中有一种方法可以将自定义标头与 POST 请求对象一起发送。我已经尝试了可用的exchange 方法。似乎我们可以将键值对与自定义​​标头一起发送,但不能将请求对象本身附加到HttpEntity. 下面的代码说明了这种尝试,它似乎是服务器的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);

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

【问题讨论】:

  • 你能发布上面请求的控制器方法吗?
  • 您要发送的标题是什么,“Content-Type”?你确定你的服务器支持吗?
  • @WillKeeling 不,我无法成功提出请求。似乎请求没有正确创建,服务器回复 400 Bad Request。
  • @RenanIvo 是的。服务器支持“Content-Type”。

标签: java spring rest spring-mvc resttemplate


【解决方案1】:
  1. 尝试启用 Spring 包的完整调试。我相信你会得到更多 关于您的“400 Bad Request”的信息:

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

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

这些步骤总是对我有帮助。

【讨论】:

  • 这里只有第一个答案适用。 2 没有帮助,因为他必须重新创建请求,这意味着他可能会更改它,并且 3 没有帮助,因为客户端是 Java。
  • 这根本不能回答问题。他不是在问如何调试 400 错误。他在问如何在 RestTemplate 中设置自定义标题。
  • 是的,但首先您应该知道 BAD REQUEST 修复它的原因还是您更喜欢猜测?
【解决方案2】:

如果您使用的是 HttpClient 3.x,请按照 this 开启日志记录。如果您使用的是 HttpClient 4.x,请按照 this 开启日志记录。这应该告诉您通过网络发送了什么,并且是调试的一个不错的起点。

【讨论】:

    【解决方案3】:

    是的,如果使用 MultiValueMap 标头而不是 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);
    

    Boolean.class 只是因为我的控制器在此端点返回布尔值(可以是任何东西)

    祝你编码顺利!

    【讨论】:

    • @Andrey Rudenko 如何在服务器控制器中接收此请求并发送响应??
    • @KJEjava48 1 - 这不是接收请求,而是通过 POST 请求将数据发布到服务器(例如单击“提交”按钮后。
    • @Andrey Rudenko 我知道。我只是想知道它的服务器端是如何工作的。你在请求中使用 HttpEntity 传递了一个像 ObjectToPass 这样的对象和一个标头中的令牌。那么你应该如何检索这些令牌和对象在服务器中?我喜欢在我的应用程序中使用这种方法,所以我也需要了解它的服务器端。这就是我问你这个的原因?
    • @KJEjava48 通常我在之前的 GET 请求中获取令牌(带有一些 JSON 对象)。然后用 passw 和 uname 编码这个 Token 得到“base64Creds”
    • @Andrey Rudenko 没关系。但是我的问题是,当这个请求到达你的服务器时,你将如何在服务器中提取这个“base64Creds”和“ObjectToPass”?
    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 2013-08-18
    • 2015-12-13
    • 1970-01-01
    • 2017-07-19
    • 2023-03-21
    • 2017-06-20
    相关资源
    最近更新 更多