我从REST开始,我有一些问题:
@Controller
是否必须按原样返回Item
对象,或将其封装在ResponseEntity
中以指定http-status-code。HttpMediaStatus.OK
(200)并返回null或HttpStatus.NO_CONTENT
(204)和null return?第二部分:我看到可以在WS方法上指定@Produces
和@Consumes
但是它的用途是什么?我的应用程序和我的方法是如此,为什么要指定MediaType.APPLICATION_JSON_VALUE
? Spring / SpringBoot是否自动将Item
或ResponseEntity
转换为json?
上下文:使用Spring Boot,hibernate,REST webservice。
谢谢。
答案 0 :(得分:0)
一方面有很多问题,我将通过一系列相关文章和参考文档的链接提供简短的答案。
控制器必须返回什么类型?
取决于您的注释和服务的RESTful-ness。您可以为controllers使用三种注释:@Controller
,@RestController
和@RepositoryRestController
。
Controller是将您的类标记为控制器的基本注释。控制器端点方法的返回类型可以是很多东西,我邀请您阅读this dedicated post以掌握它。
在开发纯REST服务时,您将专注于使用RestController和RepositoryRestController。
RestController
为Controller
+ ResponseBody。它将端点方法的返回值绑定到Web响应正文:
@RestController
public ItemController {
@RequestMapping("/items/{id}")
public Item getItem(@PathVariable("id") String id) {
Item item = ...
return item;
}
}
有了这个,当你点击http:/.../api/items/foo
时,Spring会发挥其魔力,自动将项目转换为具有相关40X状态代码和一些默认HTTP标头的ResponseEntity。
在某些时候,您需要对状态代码和标题进行更多控制,同时仍然可以从Spring Data REST的设置中受益。那时您将使用RepositoryRestController
作为返回类型ResponseEntity<Item>
,请参阅example Spring Data REST参考。
如果给定项目不存在,在特定项目的GET方法中使用什么http状态代码?
直言不讳地说:使用HttpStatus.NOT_FOUND。你正在寻找一种不存在的资源,这是错误的。
话虽如此,完全取决于您决定如何处理项目中缺少的资源。如果您的工作流程证明它是合理的,那么缺少的资源可能是完全可以接受的,确实会返回20倍的响应,但如果您没有警告它们或提供一些文档(我们是习惯和生物的生物),您可能会期望您的API用户感到困惑。约定)。但我仍然从404状态代码开始。
(...)关于WS方法的@Produces和@Consumes但是有什么用呢?我的应用程序和我的方法是这样的,为什么要指定MediaType.APPLICATION_JSON_VALUE? Spring / SpringBoot不会自动将Item或ResponseEntity转换为json吗?
@Consumes
和@Produces
分别与请求中的content-type
和accept
标头匹配。它是限制接受的输入和端点方法提供的输出的意思。
由于我们讨论的是REST服务,因此API和服务的客户端之间的通信应该是JSON格式的。感谢Spring HATEOAS,答案实际上是使用application/hal+json
内容类型格式化的。
在那种情况下,你确实不会打扰这两个注释。如果您开发接受不同内容类型(应用程序/文本,应用程序/ json,application / xml ...)的服务,并且例如向您的网站用户提供HTML视图以及向JSON或XML响应,则需要它们。自动客户服务。
对于现实生活中的例子: