【发布时间】: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