Java 创建新对象的REST方法究竟是如何工作的?

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

我正在学习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)
@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的原因。