15

可能重复:
带有请求正文的 HTTP GET

我在这里阅读了一些不提倡通过 HTTP GET 发送内容的讨论。可以通过客户端(Web 浏览器)发送的数据大小存在限制。处理 GET 数据也依赖于服务器。请参阅下面的资源部分 。

但是,我被要求测试使用 RestTemplate 通过 HTTP GET 发送内容的可能性。我在春季论坛上提到了一些讨论,但没有得到答复。(请注意通过 http Post 发送数据可以正常工作)。这里的讨论建议改用 POST。

开发环境 - JBoss AS 5.1,Spring 3.1.3

客户

    @Test
public void testGetWithBody()
{
    // acceptable media type
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
    acceptableMediaTypes.add(MediaType.TEXT_PLAIN);

    // header
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(acceptableMediaTypes);

    // body
    String body = "hello world";
    HttpEntity<String> entity = new HttpEntity<String>(body, headers);

    Map<String, Object> uriVariables = new HashMap<String, Object>();
    uriVariables.put("id", "testFile");

    // Send the request as GET
    ResponseEntity<String> result = restTemplate.exchange(
            "http://localhost:8080/WebApp/test/{id}/body",
            HttpMethod.GET, entity, String.class, uriVariables);

    Assert.assertNotNull(result.getBody());
}

服务器@Controller

    @RequestMapping(value = "/{id}/body", method = RequestMethod.GET)
public @ResponseBody
String testGetWithBody(@PathVariable String id,
        @RequestBody String bodyContent)
{
    return id + bodyContent;
}

问题- 执行此测试用例返回 500 Internal Server Error。在调试时,我发现控制器没有被击中。

  1. 理解 RestTemplate 提供了将数据作为请求正文发送的方式是否正确,但是由于服务器无法处理请求正文而发生错误?

  2. 如果通过 HTTP Get 发送的请求正文不是传统的,为什么 RestTemplate 提供 API 来允许发送它?这是否意味着很少有服务器能够通过 GET 处理请求正文?

资源- 在春季论坛上使用 RestTemplate 通过 HTTP GET 发送正文的讨论

http://forum.springsource.org/showthread.php?129510-Message-body-with-HTTP-GET&highlight=resttemplate+http+get

http://forum.springsource.org/showthread.php?94201-GET-method-on-RestTemplate-exchange-with-a-Body&highlight=resttemplate+http+get

资源- 关于通过 HTTP GET 发送正文的一般讨论

获取请求体

is-this-statement-correct-http-get-method-always-has-no-message-body

阅读请求正文时获取或发布

http-uri-get-limit

4

1 回答 1

7

理解 RestTemplate 提供了将数据作为请求正文发送的方式是否正确,但是由于服务器无法处理请求正文而发生错误?

您可以通过查看网络流量(是否使用请求正文和 GET 方法发送请求?)和服务器日志(您收到的 500 结果必须具有记录的服务器端效果,如果没有,请配置服务器这样做)。

如果通过 HTTP Get 发送的请求正文不是传统的,为什么 RestTemplate 提供 API 来允许发送它?这是否意味着很少有服务器能够通过 GET 处理请求正文?

因为它是一个通用类,还允许您制作可以包含消息正文的请求。

带有请求正文的 HTTP GET 中所述:

换句话说,任何 HTTP 请求消息都允许包含消息体,因此 [服务器] 必须考虑到这一点来解析消息。但是,GET 的服务器语义受到限制,因此主体(如果有)对请求没有语义意义。解析的要求与方法语义的要求是分开的。

GET 上的主体不能在语义上做任何事情,因为您正在请求资源。就像你告诉服务器:“给我资源 X,哦,吃些苹果!” . 服务器不会关心你的苹果并乐意为资源 X 提供服务——或者抛出一个错误,因为它不喜欢请求中的任何提议。

但是,我被要求测试通过 HTTP GET 发送内容的可能性

请告诉提出此请求的人,这是一个不必测试的案例,因为没有明智的实现支持它。

于 2012-11-07T13:38:06.757 回答