当前位置: 首页 > 知识库问答 >
问题:

控制器返回类型和httpStatus最佳实践以及REST WS中方法的生产/使用

曾骁
2023-03-14

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

  • 控制器必须返回什么类型?通常,我会问我的 Rest @Controller是否必须按原样返回 Item 对象,或者将其封装在响应实体中以指定 http 状态代码。
  • 如果给定项目不存在,则在特定项目(“/项目/2”)的 GET 方法中使用什么 http 状态代码:HttpMediaStatus.OK(200) 和空返回或HttpStatus.NO_CONTENT(204) 和空返回?

第二部分:我看到可以在WS方法上指定@Produces@Consumes,但这有什么用呢?我的应用程序和方法工作正常,为什么要指定MediaType。应用程序_JSON_VALUE?Spring/SpringBoot是否会自动将ItemResponseEntityjson?

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

谢谢你。

共有1个答案

杜鸿彩
2023-03-14

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

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

取决于您的注释和服务的RESTful性。有三种注释可用于控制器:@Controller@RestController

控制器是将类标记为控制器的基础注释。控制器endpoint方法的返回类型可以是很多东西,我邀请您阅读这篇专门的文章来了解它。在开发纯REST服务时,您将重点关注使用RestController和RepositoryRestControllerRestControllerControllerResponseBody。它将endpoint方法的返回值绑定到web响应正文:

@RestController
public ItemController {

    @RequestMapping("/items/{id}")
    public Item getItem(@PathVariable("id") String id) {
         Item item = ...

         return item;
    }

}

这样,当您点击http://…/api/items/foo时,Spring就会发挥其魔力,自动将项目转换为ResponseEntity,并带有相关的40X状态代码和一些默认的http头。

在某些时候,您将需要更好地控制状态代码和标头,同时仍然受益于Spring数据REST的设置。那时,您将使用具有响应实体的存储库控制器

如果给定项不存在,则在特定项的 GET 方法中使用什么 http 状态代码?

直言:用HttpStatus。未找到。你正在寻找一个不存在的资源,有问题。

话虽如此,如何处理项目中缺失的资源完全取决于你。如果你的工作流程证明了这一点,缺失的资源可能是完全可以接受的,它确实会返回20倍的响应,尽管如果你没有警告你的应用编程接口的用户或提供一些留档(我们是习惯和惯例的产物),你可能会感到困惑。但是我仍然会从404状态代码开始。

(…)@Produces和@消耗WS方法,但这有什么用呢?我的应用程序和方法都可以工作,为什么要指定MediaType.APPLICATION_JSON_VALUE?Spring/SpringBoot不会自动将Item或响应实体转换为json吗?

@Consumes@Produces分别与来自请求的内容类型接受标头进行匹配。这是一种限制终结点方法接受的输入和提供的输出的方法。

由于我们谈论的是 REST 服务,因此 API 客户端和服务之间的通信应采用 JSON 格式。多亏了Spring仇恨,答案实际上是使用应用程序/哈尔json内容类型格式化的。在这种情况下,您确实不能打扰这两个注释。如果您开发的服务接受不同的内容类型(应用程序/文本、应用程序/json、应用程序/xml 等),并且例如,向网站的用户提供 HTML 视图,向服务的自动客户端提供 JSON 或 XML 响应,则需要它们。

对于现实生活中的例子:

  • Facebook为应用程序提供了Graph API,让应用程序可以从其图形中读取/写入数据,而用户则很高兴(?)浏览网页
  • 谷歌也使用谷歌地图API

 类似资料:
  • CRUD代表创建,读取,更新,删除。这是四种方法(如果区分查看一个记录和查看所有记录,则是五种方法)。在Rails中,处理CRUD的规范方法似乎包括七种方法。例如,使用 速记法为Order对象创建路由会生成以下七条路由: 这就是我困惑的根源。为 和 设置单独的操作/路由有什么意义?使用单独的操作查看页面和在数据库中创建记录有什么好处?我理解它是如何在Rails中实现的,例如: 在使用Rails之前

  • 我想回复ResponseEntity的回复。我对在ResponseEntity中提到返回类型的最佳实践有点困惑。 这是我的控制器: 我的主要责任: 这里我的返回类型是GenericResponse、AdminAccount。在ResponseEntity中提及所有退货类型是否是一种良好的做法? 哪个是最好的方法

  • 在我的Play web应用程序中,我使用的是从未来获取结果。有没有其他更好的方法(使用最佳实践)从数据库中获得结果?如果我使用或我的控制器完成执行,结果还不在中。下面是我的控制器方法。一切正常,但我需要在Scala中遵循更多的最佳实践。 编辑:我已经在使用。但在这个例子中,我不能使用,基本上是因为。我想在验证json之前,我需要一个来包围该方法的所有代码。 使用平面地图和map的新方法。我的问题是

  • 好的,所以我找不到关于这个主题的任何有用的材料,我找到的一大块文章中有一个方法是用@HystrixCommand注释的,并且定义了一个回退方法。 我找到的另一个解决方案是使用@DefaultProperties(defaultFallback=“fallbackMethod”),但问题是这些方法需要具有兼容的返回类型。 不幸的是,在我的服务中,我有许多具有完全不同签名的方法,我还需要掌握可抛出的方

  • 提交对映改动 一次提交要包括一个相关改动。例如,对于两个错误的修复应该进行两次不同的提交。精简的提交可以让其他的开发团队人员更简单地明白其改动的用义。如果其中一次提交的改动出现了问题,也可以方便地回滚到改动之前的状态。借助暂存功能来标记相关的改动文件,Git 可以为你打造出非常精准的提交。 频繁地提交改动 经常性地提交改动可以确保不会出现特别庞大的提交,同时也可以比较精准地对应到所需要的改动上。此

  • 我想从spring控制器返回一个字符串(json字符串)作为它接收到的AJAX调用的响应,响应可能会根据我是否提交了@Valid表单而有所不同。这就是我处理它的方式,我想知道这是否被认为是最佳实践?请注意,我使用的是@RestController,所以@ResonseBody应用所有方法。