Spring RestTemplate - 带请求正文的http GET

时间:2012-11-07 13:22:58

标签: http get

  

可能重复:
  HTTP GET with request body

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

但是,我被要求测试使用RestTemplate通过HTTP GET发送内容的可能性。我在春季论坛上几乎没有讨论,但没有回答。 (请注意通过http Post发送数据工作正常)。讨论here建议使用POST。

dev env - 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内部服务器错误。在调试时,我发现控制器没有命中。

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

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

  3.   

    资源 - 在春季论坛上使用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发送正文的一般性讨论

    get-with-request-body

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

    get-or-post-when-reading-request-body

    http-uri-get-limit

1 个答案:

答案 0 :(得分:7)

  

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

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

  

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

因为它是一个通用类,它还允许您创建可以包含消息体的请求。

HTTP GET with request body中所述:

  

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

GET 上的正文无法在语义上执行任何操作,因为您请求资源。这就像你告诉服务器:“给我资源X,哦,还有一些苹果!”。服务器不会关心你的苹果,并且很乐意为资源X服务 - 或者因为它不喜欢请求中的任何优惠而抛出错误。

  

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

请告诉请求此人的人,这是一个不应该被测试的案例,因为没有合理的实施支持它。