Spring RestTemplate - 带请求正文的http GET

Tus*_*hra 15 get http

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

我在这里看过几个不提倡通过HTTP GET发送内容的讨论.可以通过客户端(Web浏览器)发送的数据大小有限制.处理GET数据也取决于服务器.请参阅 以下资源部分.

但是,我被要求测试使用RestTemplate通过HTTP GET发送内容的可能性.我在春季论坛上几乎没有讨论,但没有回答.(请注意通过http Post发送数据工作正常).这里的讨论建议使用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());
}
Run Code Online (Sandbox Code Playgroud)

服务器 @Controller

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

问题 - 执行此测试用例会返回500内部服务器错误.在调试时,我发现控制器没有命中.

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

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

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

得到-与请求体

是,这个语句纠正-HTTP-GET-方法,始终有 - 无消息体

得到有或后当读取请求体

HTTP-URI-得到限制

Cod*_*ter 7

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

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

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

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

HTTP GET中所述,请求正文:

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

GET上的主体无法在语义上执行任何操作,因为您正在请求资源.这就像你告诉服务器:"给我资源X,哦,还有一些苹果!" .服务器不关心你的苹果并愉快地提供资源X - 或者因为它不喜欢请求中的任何提议而抛出错误.

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

请告诉那个请求这个的人,这是一个不应该被测试的情况,因为没有合理的实现支持它.

  • 有时将查询参数实现为json对象并放入正文而不是url更方便.在这种情况下,服务器对苹果感兴趣. (2认同)