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

时间:2015-02-22 11:01:37

标签: java spring rest spring-mvc annotations

我正在学习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个参数:

  1. @RequestBody帐户newAccount :我认为它会从请求的正文字段中提取帐户对象。它应该是 JSON 格式,然后自动转换为标准Java对象(在这种情况下为帐户类的实例)。

  2. @Value(“#{request.requestURL}”)StringBuffer url :我认为做同样的事情就是这样:

     request.getRequestURL();
    

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

  3. 然后该方法只使用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 对象?使用什么?

    3. TNX

1 个答案:

答案 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资源,以便客户端可以获取此资源并检查它包含的内容。