9

我有一个接受 JSON 对象的 REST 调用,比如说一个人。创建此对象(验证并保存到数据库)后,我需要返回新创建的 JSON 对象。

我认为标准做法是返回201 Accepted而不是立即返回对象。但是我的应用程序立即需要新创建的对象。

我有一个控制器方法,它接受一个 POST 调用,调用一个服务类,然后调用一个使用 Hibernate 创建对象的 DAO。将其保存到数据库后,我将调用另一个控制器方法,该方法获取人员的 ID 并返回对象。

我的问题,这是更好的方法吗?即调用另一个Controller方法来获取新创建的对象。或者 POST 调用本身应该返回 Object。

主要问题是: 调用另一种方法需要往返,我想这是一种矫枉过正。(服务->DAO->休眠->数据库)。相反,我认为我应该在将对象保存在同一个调用中之后立即从数据库中获取它(从处理 POST 的方法中)。

这里的架构标准是什么?

4

3 回答 3

23

尝试使用ResponseEntitywhich 返回 HTTP 状态以及您需要的对象。

示例代码是(这是我返回客户对象的代码,根据您的需要进行更改):

// imports (for your reference)
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

// spring controller method
@RequestMapping(value = "getcust/{custid}", method = RequestMethod.GET, produces={"application/json"})
public ResponseEntity<Customer> getToken(@PathVariable("custid") final String custid, HttpServletRequest request) {

    customer = service.getCustById(custid);

    return new ResponseEntity<Customer>(customer, HttpStatus.OK);
}

阅读本文档以了解更多信息。那里提供了一些示例代码。

于 2013-04-21T09:35:57.177 回答
5

来自POST 的 HTTP 规范

如果在源服务器上创建了资源,则响应应该是 201(已创建)并包含描述请求状态并引用新资源的实体和 Location 标头(参见第 14.30 节)。

您将在响应正文中返回的内容将取决于您解释的严格程度an entity which describes the status of the request and refers to the new resource- 许多实现只是返回新创建实体本身的表示。最重要的是将Location响应中的标头设置为新创建资源的 URI,以便客户端可以在他们选择时立即获取它。

于 2013-04-21T05:55:57.130 回答
0

您可以在使用@ResponseBody 将实体对象持久化后,在@ResponseStatus 之后返回实体对象,但这不是标准的,因此您的客户端必须了解此自定义,否则如果您的客户端依赖于标准 API,您必须遵守标准通过返回无效。

于 2013-04-21T06:49:23.690 回答