带请求正文的http GET

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

我在这里读了几个讨论,不主张通过HTTP GET发送内容。 可以通过客户端(网络浏览器)发送的数据大小有限制。 处理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());
}

服务器 @控制器

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

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

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

  • 如果通过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发送主体的一般性讨论

    得到-与请求体

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

    得到有或后当读取请求体

    HTTP-URI-得到限制


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

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

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

    因为它是一个通用类,它还允许您创建可包含邮件正文的请求。

    正如HTTP请求正文中所述:

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

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

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

    请告诉请求者这是一个不应该被测试的情况,因为没有明智的实现支持它。

    链接地址: http://www.djcxy.com/p/71453.html

    上一篇: http GET with request body

    下一篇: For Restful API, can GET method use json data?