这个创建新 object 的 REST 方法到底是如何工作的?
How exactly does this REST method that creates a new object work?
我正在学习 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());
}
我知道这种方法可以在数据库中创建一个新帐户。
所以它处理POST Http Request(代表一个插入操作)到URL /accounts .
createAccount() 方法有两个参数:
@RequestBody Account newAccount:我认为它从 Account object body请求字段。它应该是JSON格式,然后自动转换成标准的Javaobject(Account[=的实例67=] class 在这种情况下)。
@Value("#{request.requestURL}") StringBuffer url:我认为这是同一件事做类似的事情:
request.getRequestURL();
并且它包含客户端用来发出请求的URL。是真的吗?但为什么它把它放入 StringBuffer 而不是简单的 String?
然后该方法简单地使用 DAO class 将 object 保存在数据库上,最后 return 一个 HttpEntity object 作为结果。
这个 HttpEntity 是由同一个 class 中定义的 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 官方文档,此 object 代表 HttpResponse 实体 ,由 [=98 组成=] 和 body。
我对这个项目的疑惑是:
在我的例子中,它只设置了具有 url 值的 heder(客户端使用的 URL请求)和新插入的 ID object。此 HttpResponse 的 body 字段为空?
为什么我要 return 这个 HttpResponse object?有什么用?
Tnx
@Value("#{request.requestURL}") StringBuffer url: I think that it is the same thing of do somtthing like to:
request.getRequestURL();
And it contains the URL used by the client to make the request. Is it true? But why it put it into a StringBuffer and not into a simple String?
因为方法 HttpServletRequest.getRequestURL()
return 是一个 StringBuffer,而不是一个 String。
The body field of this HttpResponse is empty?
是的,是的,因为代码没有填充它。您可以简单地使用浏览器调用此操作并查看响应 returned.
Why have I to return this HttpResponse object? For what is used?
您不必。但您可以选择。那取决于你。你应该知道你为什么 return 为什么 return。此处程序员的意图是 return 没有 body 的 HTTP 响应,其 Location header 包含 URL 和 CREATED 状态。这是 REST 应用程序中 POST 之后 return 的常规做法:POST 用于创建新资源,它 return 的状态 CREATED 表示已正确创建资源,以及创建资源的URL,以便客户端可以获取此资源并查看其中包含的内容。
我正在学习 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());
}
我知道这种方法可以在数据库中创建一个新帐户。
所以它处理POST Http Request(代表一个插入操作)到URL /accounts .
createAccount() 方法有两个参数:
@RequestBody Account newAccount:我认为它从 Account object body请求字段。它应该是JSON格式,然后自动转换成标准的Javaobject(Account[=的实例67=] class 在这种情况下)。
@Value("#{request.requestURL}") StringBuffer url:我认为这是同一件事做类似的事情:
request.getRequestURL();
并且它包含客户端用来发出请求的URL。是真的吗?但为什么它把它放入 StringBuffer 而不是简单的 String?
然后该方法简单地使用 DAO class 将 object 保存在数据库上,最后 return 一个 HttpEntity object 作为结果。
这个 HttpEntity 是由同一个 class 中定义的 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 官方文档,此 object 代表 HttpResponse 实体 ,由 [=98 组成=] 和 body。
我对这个项目的疑惑是:
在我的例子中,它只设置了具有 url 值的 heder(客户端使用的 URL请求)和新插入的 ID object。此 HttpResponse 的 body 字段为空?
为什么我要 return 这个 HttpResponse object?有什么用?
Tnx
@Value("#{request.requestURL}") StringBuffer url: I think that it is the same thing of do somtthing like to:
request.getRequestURL();
And it contains the URL used by the client to make the request. Is it true? But why it put it into a StringBuffer and not into a simple String?
因为方法 HttpServletRequest.getRequestURL()
return 是一个 StringBuffer,而不是一个 String。
The body field of this HttpResponse is empty?
是的,是的,因为代码没有填充它。您可以简单地使用浏览器调用此操作并查看响应 returned.
Why have I to return this HttpResponse object? For what is used?
您不必。但您可以选择。那取决于你。你应该知道你为什么 return 为什么 return。此处程序员的意图是 return 没有 body 的 HTTP 响应,其 Location header 包含 URL 和 CREATED 状态。这是 REST 应用程序中 POST 之后 return 的常规做法:POST 用于创建新资源,它 return 的状态 CREATED 表示已正确创建资源,以及创建资源的URL,以便客户端可以获取此资源并查看其中包含的内容。