Spring RestTemplate - 带有请求正文的http GET [重复]

2024-05-26

可能的重复:
带请求正文的 HTTP GET https://stackoverflow.com/questions/978061/http-get-with-request-body

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

但是,我被要求测试使用 RestTemplate 通过 HTTP GET 发送内容的可能性。我在春季论坛上提到了一些讨论,但没有得到答复。 (请注意,通过 http Post 发送数据效果很好)。讨论here https://stackoverflow.com/questions/11091160/rest-api-get-request-with-body建议使用 POST 代替。

开发环境 - JBoss AS 5.1,Spring 3.1.3

Client

    @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());
}

Server@控制器

    @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 处理请求正文?

资源- Spring 论坛上关于使用 RestTemplate 通过 HTTP GET 发送正文的讨论

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

获取请求主体 https://stackoverflow.com/questions/978061/http-get-with-request-body

is-this-statement- Correct-http-get-method-always-has-no-message-body https://stackoverflow.com/questions/5216567/is-this-statement-correct-http-get-method-always-has-no-message-body

读取请求正文时获取或发布 https://stackoverflow.com/questions/6031136/get-or-post-when-reading-request-body

http-uri-获取限制 https://stackoverflow.com/questions/266322/http-uri-get-limit


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

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

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

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

如中所述带请求正文的 HTTP GET https://stackoverflow.com/questions/978061/http-get-with-request-body:

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

GET 上的主体cannot从语义上做任何事情,因为你是请求一种资源。就像你告诉服务器:“给我资源X,哦,还有一些苹果!”。服务器不会关心你的苹果并愉快地提供资源 X - 或者抛出错误,因为它不喜欢请求中的任何优惠。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring RestTemplate - 带有请求正文的http GET [重复] 的相关文章

随机推荐