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



我正在学习Spring Core认证,我对Spring MVC如何处理示例Spring MVC Web应用程序的控制器方法有以下疑问。

因此,在我的例子中,我有这样的方法:

/**
 * 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/accounts的POSTHttp请求(表示插入操作)。

createAccount()方法采用两个参数:

  1. @RequestBody Account newAccount:我认为它从请求的主体字段中提取AccountSON格式,然后自动转换为标准Java对象(在本例中为Account类的实例)。

  2. @Value("#{request.requestURL}")StringBuffer-url:我认为这和一样

     request.getRequestURL();
    

    它包含客户端用于发出请求的URL。这是真的吗?但是,为什么它将其放入StringBuffer而不是简单的String

然后,该方法只需使用一个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实体,该实体由头和主体组成。

我对这个项目的怀疑是:

  1. 在我的情况下,它只设置具有url值(客户端用于发出请求的url)和新插入对象id的heder。此HttpResponse的正文字段为空?

  2. 为什么我必须返回这个HttpResponse对象?用于什么?

Tnx

@Value("#{request.requestURL}")StringBuffer url:我认为这和一样

request.getRequestURL();

它包含客户端用于发出请求的URL。这是真的吗?但是为什么它把它放在StringBuffer中,而不是放在一个简单的String中呢?

因为方法HttpServletRequest.getRequestURL()返回的是StringBuffer,而不是String。

此HttpResponse的正文字段为空?

是的,因为代码没有填充它。你可以简单地使用浏览器来调用这个操作并查看返回的响应。

为什么我必须返回这个HttpResponse对象?用于什么?

您不必。但是您可以选择。这取决于你。你应该知道你为什么要退货。这里程序员的意图是返回一个没有正文的HTTP响应,带有一个包含URL和CREATED状态的Location头。这是REST应用程序中POST之后要返回的常规内容:POST用于创建新资源,它返回CREATED状态以表示资源已正确创建,以及创建的资源的URL,这样客户端就可以获得该资源并检查它包含的内容。

最新更新