REST WS

时间:2018-02-05 09:43:32

标签: rest web-services spring-boot controller media-type

我从REST开始,我有一些问题:

  • 控制器必须返回什么类型?通常情况下,我询问我的Rest @Controller是否必须按原样返回Item对象,或将其封装在ResponseEntity中以指定http-status-code。
  • 如果给定项目不存在,则在特定项目的GET方法中使用什么http状态代码(" / items / 2"):HttpMediaStatus.OK(200)并返回null或HttpStatus.NO_CONTENT(204)和null return?

第二部分:我看到可以在WS方法上指定@Produces@Consumes但是它的用途是什么?我的应用程序和我的方法是如此,为什么要指定MediaType.APPLICATION_JSON_VALUE? Spring / SpringBoot是否自动将ItemResponseEntity转换为json?

上下文:使用Spring Boot,hibernate,REST webservice。

谢谢。

1 个答案:

答案 0 :(得分:0)

一方面有很多问题,我将通过一系列相关文章和参考文档的链接提供简短的答案。

  

控制器必须返回什么类型?

取决于您的注释和服务的RESTful-ness。您可以为controllers使用三种注释:@Controller@RestController@RepositoryRestController

Controller是将您的类标记为控制器的基本注释。控制器端点方法的返回类型可以是很多东西,我邀请您阅读this dedicated post以掌握它。 在开发纯REST服务时,您将专注于使用RestControllerRepositoryRestControllerRestControllerController + 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-typeaccept标头匹配。它是限制接受的输入和端点方法提供的输出的意思。

由于我们讨论的是REST服务,因此API和服务的客户端之间的通信应该是JSON格式的。感谢Spring HATEOAS,答案实际上是使用application/hal+json内容类型格式化的。 在那种情况下,你确实不会打扰这两个注释。如果您开发接受不同内容类型(应用程序/文本,应用程序/ json,application / xml ...)的服务,并且例如向您的网站用户提供HTML视图以及向JSON或XML响应,则需要它们。自动客户服务。

对于现实生活中的例子:

  • Facebook提供Graph API应用程序从其图表读取/写入,而用户则愉快地(?)在网页上浏览
  • Google对Google Maps API
  • 采用相同的做法