我在这里读到的一些讨论并不主张通过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内部服务器错误。在调试时,我发现控制器没有命中。
理解RestTemplate提供了将数据作为请求体发送的方式是否正确,但是因为服务器无法处理请求体而发生错误?
如果通过HTTP Get发送的请求正文不常规,为什么RestTemplate会提供允许发送它的API?这是否意味着很少有服务器能够通过GET处理Request主体?
资源 - 在春季论坛上使用RestTemplate通过HTTP GET发送正文的讨论
资源 - 关于通过HTTP GET发送正文的一般性讨论
is-this-statement-correct-http-get-method-always-has-no-message-body
答案 0 :(得分:7)
理解RestTemplate提供了将数据作为请求体发送的方式是否正确,但是由于服务器无法处理请求体而发生错误?
您可以通过查看网络流量(请求是否通过请求正文和GET方法发送?)和服务器日志来判断(您收到的500结果必须具有记录的服务器端效果,如果不,配置服务器这样做。)
如果通过HTTP Get发送的请求正文不是常规的,为什么RestTemplate会提供允许发送它的API?这是否意味着很少有服务器能够通过GET处理Request主体?
因为它是一个通用类,它还允许您创建可以包含消息体的请求。
如HTTP GET with request body中所述:
换句话说,任何HTTP请求消息都允许包含消息体,因此[服务器]必须解析消息。但是,GET的服务器语义受到限制,使得正文(如果有的话)对请求没有语义含义。解析的要求与方法语义的要求是分开的。
GET 上的正文无法在语义上执行任何操作,因为您请求资源。这就像你告诉服务器:“给我资源X,哦,还有一些苹果!”。服务器不会关心你的苹果,并且很乐意为资源X服务 - 或者因为它不喜欢请求中的任何优惠而抛出错误。
但是,我被要求测试通过HTTP GET发送内容的可能性
请告诉请求此人的人,这是一个不应该被测试的案例,因为没有合理的实施支持它。