关于Spring RestTemplate:Spring RestTemplate – 带请求正文的http GET

Spring RestTemplate - http GET with request body

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
HTTP GET with request body

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

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

dev env - JBoss AS 5.1,Spring 3.1.3

客户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    @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

1
2
3
4
5
6
7
    @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处理Request主体?

  • Resources - discussions on sending body via HTTP GET using RestTemplate at spring forum

    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

    Resources - General discussions on sending body via HTTP GET

    得到-与请求体

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

    得到有或后当读取请求体

    HTTP-URI-得到限制


    Is it correct to understand that the RestTemplate provides the way to send data as request body, but the error occurs because the server could not handle the request body ?

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

    If the request body sent via HTTP Get is not conventional why does RestTemplate provide the APIs to allow sending it ? Does this mean there are few servers capable of handling the Request body via GET ?

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

    如HTTP GET中所述,请求正文:

    In other words, any HTTP request message is allowed to contain a message body, and thus [a server] must parse messages with that in mind. Server semantics for GET, however, are restricted such that a body, if any, has no semantic meaning to the request. The requirements on parsing are separate from the requirements on method semantics.

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

    However, I've been asked to test the possibility to send content via HTTP GET

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