Java Restful服务命名约定?

Java Restful服务命名约定?,java,rest,Java,Rest,对于restfull服务,名词是否可以省略和丢弃 而不是/service/customers/555/orders/111 我可以/应该公开:/service/555/111 第一个选项是强制性的还是有几个选项,这是有争议的?在某种程度上,命名RESTful端点的“规则”应该遵循与“干净代码”相同的命名规则 意思:名字应该有意义。他们应该说他们的意思,说他们的意思 来自那里:这可能取决于该服务的性质。如果您只能“服务”客户,那么您可以省略客户部分,因为这不会添加(很多)有意义的信息。但是如果你以

对于restfull服务,名词是否可以省略和丢弃

而不是
/service/customers/555/orders/111

我可以/应该公开:
/service/555/111

第一个选项是强制性的还是有几个选项,这是有争议的?

在某种程度上,命名RESTful端点的“规则”应该遵循与“干净代码”相同的命名规则

意思:名字应该有意义。他们应该说他们的意思,说他们的意思

来自那里:这可能取决于该服务的性质。如果您只能“服务”客户,那么您可以省略客户部分,因为这不会添加(很多)有意义的信息。但是如果你以后想为其他类型的客户服务呢

换句话说:我们无法告诉您什么适合您的应用程序,因为这取决于您环境的需求/目标


值得注意的是:不要只考虑今天的要求。退后一步,考虑那些看起来最有可能的“未来成长道路”。然后确保您今天定义的API能够很好地与未来最有可能出现的扩展配合使用。

这完全取决于您,我认为拥有这些名词的好处在于,它可以帮助您从URL中看到服务试图实现的目标

还要考虑到,在“客户”下,您可以有如下内容,并且可以从URL中区分客户的订单和报价

  • /服务/客户/555/quote/111
  • /服务/客户/555/订单/111

    • REST的一个核心方面是URL应被视为不透明实体。客户端应该永远不要创建URL,只使用服务器提供的URL。只有托管实体的服务器需要了解URL结构

      因此,在设计服务时,请使用对您最有意义的URL方案

      关于你提到的选项:

      • 如果您想添加产品、收据或其他实体,省略名词会使您难以扩展服务
      • 拥有低于客户的订单让我感到惊讶(但再一次,这取决于您设计的服务)。我希望看到类似于
        /service/customers/555
        /service/orders/1234567
        的东西
      无论如何,从服务返回的RESTful客户文档应该包含指向他或她的订单的链接,反之亦然(加上所有其他相关关系)

      而不是/service/customers/555/orders/111

      我可以/应该公开:/service/555/111吗

      问题很广泛,但当您使用REST路径定义嵌套信息时,必须尽可能明确。
      如果在URL中提供长路径对您来说是一个问题,那么可以在请求主体中提供上下文信息

      我认为短途
      /service/555/111
      缺乏一致性

      假设
      /service/555/111
      对应于为客户
      555
      和订单
      111
      调用服务。 你知道的。但是API的客户机不一定知道路径的含义是什么

      此外,假设现在您希望为客户调用相同的服务
      555
      ,但为2018年
      2018
      。现在怎么办?
      就像这样:
      /service/555/2018
      很容易出错,因为您必须添加一个参数来传递最后的路径值,
      service/555/years/2018
      会使API定义不一致


      清晰、简单和一致性很重要

      请遵循最佳实践。

      根据我的说法,名词的使用是不必要的,也不符合任何标准,但它的使用可以帮助您的端点更具体、更容易理解

      所以,如果任何命名法使你的URL更容易让人阅读或理解,那么我通常更喜欢创建并保持简单的类型或URL。它还帮助您的服务消费者了解任何服务的功能,部分是通过名称本身

      对于restfull服务,名词是否可以省略和丢弃

      对。REST不关心资源标识符的拼写

      URL缩短器工作得很好

      拼写的选择是由当地惯例决定的,从这个意义上讲,它们很像变量

      理想情况下,拼写独立于基础域和数据模型,因此您可以在不更改api的情况下更改模型。吉姆·韦伯用这种方式表达了这个想法

      网络不是你的领域,它是一个文档管理系统。所有HTTP谓词都适用于文档管理域。URI不映射到域对象,这违反了封装。工作(例如:向域模型发出命令)是管理资源的副作用。换句话说,这些资源是反腐败层的一部分。集成域中的资源应该比业务域中的业务对象多得多

      资源使您的域模型适应web


      也就是说,如果您希望客户机在您的文档中发现URI(而不是从指定的超媒体响应中读取),那么使用遵循简单概念模型的URI拼写将是一个好主意。

      完全由您决定。如果你在路径中找到了名字,那么就把它们放在那里吧。我注意到你的问题仍然是“开放的”——因为你没有接受答案。请看一看,然后决定是否要回答。或者让我知道是否有什么我可以做的,以加强我的投入,使其值得接受。接受帮助未来的读者确定问题是否得到解决,并表示感激