Java 创建新对象的REST方法究竟是如何工作的?
我正在学习Spring核心认证,我对Spring MVC如何处理示例Spring MVC webapp的控制器方法有以下疑问 因此,在我的示例中,我有以下方法:Java 创建新对象的REST方法究竟是如何工作的?,java,spring,rest,spring-mvc,annotations,Java,Spring,Rest,Spring Mvc,Annotations,我正在学习Spring核心认证,我对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) @ResponseS
/**
* 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());
}
它包含客户端用于发出请求的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值的heder,url值是客户端用于发出请求的url,并且具有新插入对象的id。此HttpResponse的body字段为空
为什么我要返回这个HttpResponse对象?用什么
Tnx
@Value{request.requestURL}StringBuffer url:我认为这和做一些事情是一样的,比如:
request.getRequestURL();
request.getRequestURL();
它包含客户端用于发出请求的URL。这是真的吗?但为什么它将其放入StringBuffer而不是简单的字符串中呢
因为该方法返回的是StringBuffer,而不是字符串
此HttpResponse的body字段为空
是的,它是,因为代码没有填充它。您可以简单地使用浏览器调用此操作并查看返回的响应
为什么我要返回这个HttpResponse对象?用什么
你不必这么做。但是你可以选择。这取决于你。你应该知道你为什么要退货。程序员在这里的意图是返回一个没有正文的HTTP响应,带有一个包含URL的位置头和一个已创建状态。在REST应用程序中,这是在POST之后返回的常规操作:POST用于创建新资源,它返回已创建的状态以表示资源已正确创建,以及已创建资源的URL,这样客户端就可以获取此资源并检查它包含的内容。mmm好的,但它让我感觉到它不包含状态,而是按account.getEntityId它是否包含对象id?@ResponseStatusHttpStatus.CREATED:这就是将状态设置为CREATED 201的原因。