我正在学习Spring Core认证,我对Spring MVC如何处理示例Spring MVC webapp的控制器方法有以下疑问。
所以,在我的例子中,我有这个方法:
/**
* Creates a new Account, setting its URL as the Location header on the
* response.
*/
@RequestMapping(value = "/accounts", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public HttpEntity<String> createAccount(@RequestBody Account newAccount,
@Value("#{request.requestURL}") StringBuffer url) {
Account account = accountManager.save(newAccount);
return entityWithLocation(url, account.getEntityId());
}
我知道此方法会在数据库中创建一个新帐户。
因此它会向 / accounts 处理 POST Http请求(代表插入操作)。
createAccount()方法有2个参数:
@RequestBody帐户newAccount :我认为它会从请求的正文字段中提取帐户对象。它应该是 JSON 格式,然后自动转换为标准Java对象(在这种情况下为帐户类的实例)。
@Value(“#{request.requestURL}”)StringBuffer url :我认为做同样的事情就是这样:
request.getRequestURL();
它包含客户端用于发出请求的URL。这是真的吗?但为什么它将它放入 StringBuffer 而不是简单的字符串?
然后该方法只使用DAO类将对象持久保存在DB上,最后返回 HttpEntity 对象作为结果。
这个 HttpEntity 是由同一个类中定义的 entityWithLocation()方法创建的,这个方法:
private HttpEntity<String> entityWithLocation(StringBuffer url,
Object resourceId) {
// Configure and return an HttpEntity object - it will be used to build
// the HttpServletResponse
HttpHeaders headers = new HttpHeaders();
headers.setLocation(getLocationForChildResource(url, resourceId));
return new HttpEntity<String>(headers);
}
据我所知,在这种情况下阅读Spring官方文档,该对象代表 HttpResponse实体,它由头和主体组成。
我对这个问题的怀疑是:
在我的情况下,它只设置了具有 url 值(客户端用来发出请求的URL)和新插入对象的id的heder。 HttpResponse 的正文字段是空的?
为什么我要返回 HttpResponse 对象?使用什么?
TNX
答案 0 :(得分:0)
@Value(&#34;#{request.requestURL}&#34;)StringBuffer url:我认为做同样的事情就是这样:
request.getRequestURL();
它包含客户端用于发出请求的URL。这是真的吗?但为什么它把它放入StringBuffer而不是简单的String?
因为方法HttpServletRequest.getRequestURL()
返回StringBuffer而不是String。
此HttpResponse的正文字段为空?
是的,因为代码没有填充它。您只需使用浏览器调用此操作并查看返回的响应。
为什么要返回此HttpResponse对象?用什么?
你 。但你可以选择。那取决于你。你应该知道为什么要归还你返回的东西。这里程序员的目的是返回一个没有正文的HTTP响应,一个包含URL的Location头和一个CREATED状态。这是在REST应用程序中POST后返回的常规事物:POST用于创建新资源,它返回状态CREATED以表示资源已正确创建,以及创建的URL资源,以便客户端可以获取此资源并检查它包含的内容。