【问题标题】:How to add a body to a HTTP request using Java Spring's RestTemplate's exchange method?如何使用 Java Spring 的 RestTemplate 的交换方法向 HTTP 请求添加正文?
【发布时间】:2018-08-22 00:53:27
【问题描述】:

我正在尝试使用 RestTemplate 的 exchange 方法发送 HTTP 请求。但是,由于某种原因,已发送请求的 HTTP 正文似乎为空。

这是我目前拥有的代码(原代码比较复杂):

package somepackage;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.client.RestTemplate;

public class SomeMainClass {
    public static void main(String[] args) {
        HttpEntity<String> entity = new HttpEntity<>("body contents", new HttpHeaders());
        new RestTemplate().exchange("http://localhost:5678/someRequest", HttpMethod.GET, entity, String.class);
    }
}

为了确认上面的代码是否有效,我在终端中运行了nc -l 5678(它侦听端口 5678 上的请求),并在我的 IDE 中运行了上面的代码。我终端中的nc 命令打印出一个没有正文的HTTP 请求(我希望它有一个带有字符串“正文内容”的正文)。

为什么这不起作用?我该如何解决?

注意:这是使我决定使用exchange 方法的要求

  • 必须是 GET 请求。
  • 请求需要有正文。
  • 我必须设置一些标题。
  • 我需要阅读响应的正文。

【问题讨论】:

  • HTTP 服务器可以选择忽略 GET 请求的正文。见stackoverflow.com/questions/978061/http-get-with-request-body
  • 您能否尝试详细说明您认为应该使用GET 请求并包含正文的原因?也许有更好的方法来解决您的问题。
  • @junvar 我正在实施的 REST 服务提供 AWS S3 预签名 URL。 (它们是动态生成的 URL,会在一段时间后过期。)我正在使用 URL 下载静态文件(或者至少是通常是静态的文件)(因此使用 GET 方法)。我需要将过期时间作为参数传递(因此是正文),并且我不确定是否需要其他参数(稍后我可能会进行一些身份验证)。我的 REST 服务中的所有其他内容都使用 JSON 参数,如果有一个东西使用其他东西,那就太奇怪了。
  • 不确定这是否是最好的方法,但您可以在网址中添加到期时间,例如http://localhost:5678/someRequest?expiry=23000
  • @Kartik 我想我会照你说的做。

标签: java spring http resttemplate


【解决方案1】:

GET 方法没有正文。您可能想将HttpMethod.GET 更改为HttpMethod.POST

如果您想在GET 中提供参数,您可以将URL 更改为http://localhost:5678/someRequest?expiry=23000 之类的内容。 更多详情请访问Spring RestTemplate GET with parameters

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2016-09-21
    • 2019-10-25
    • 1970-01-01
    • 2015-12-13
    • 2019-03-20
    相关资源
    最近更新 更多