Java RESTAPI服务上下文和资源url

Java RESTAPI服务上下文和资源url,java,rest,jersey,jax-rs,microservices,Java,Rest,Jersey,Jax Rs,Microservices,我们在应用服务器上运行多个服务,每个服务都有一个上下文。服务的名称将自动添加到url,因为同一应用程序服务器上可以有多个服务。 现在我们正在创建一个名为Draws的新服务,这意味着url将是 但是,现在讨论的是该服务的api路径(资源)。既然我们得到了平局,在我看来这应该是平局。 这意味着它将具有url {gameNo} 2次画图-思考? 这里有这样的想法,即服务只有抽奖,因此抽奖{gameNo}就足够了。 但在我看来,draws资源是服务的api接口,就像draws是图书馆里的书,draws

我们在应用服务器上运行多个服务,每个服务都有一个上下文。服务的名称将自动添加到url,因为同一应用程序服务器上可以有多个服务。
现在我们正在创建一个名为Draws的新服务,这意味着url将是

但是,现在讨论的是该服务的api路径(资源)。既然我们得到了平局,在我看来这应该是平局。 这意味着它将具有url

{gameNo}

2次画图-思考?

这里有这样的想法,即服务只有抽奖,因此抽奖{gameNo}就足够了。
但在我看来,draws资源是服务的api接口,就像draws是图书馆里的书,draws是一章。。。而且应该可以在书中增加更多的章节

然后,为了实现,我们使用了Jersey。这意味着我们将有一个带有@Path({gameNo})的资源

编辑1:
我们的服务前面有网关,因此上下文永远不会向最终用户公开,它只是指向特定的服务。由于多个服务可以在同一主机上运行:端口

编辑2:
url的上下文部分是服务发现查找的一部分

编辑3:

我们实际上不是在url中进行版本控制,而是在Accept header中进行版本控制,因此实际上我的url与clementinos相同,但url的版本部分不会让您的头脑混乱于书籍、图书馆或章节。只看你的实体:“绘制”是你的实体吗?那么它应该是
http://url:port/draws/{gameNo}

对于Rest API设计,您可以阅读以下参考资料:

我建议你看看理查森成熟度模型


我也喜欢。(过去他们建议我们阅读代码以提高我们的才能,现在您也可以阅读rest API。)

如果您设计绘图服务,您的url应该是:

{gameNo}

如果您计划用其他端点扩展服务,那么您可能正在设计更通用的东西。如果是这种情况,请相应地命名

无论如何,你都不应该画画

此外,我建议使用小写和https(如果可以的话)


最近,我发布了一篇关于设计RESTful API时最常出现的问题的摘要,这可能会有所帮助。

我会避免使用2x“draws”

下面是一种设计URI结构的可能方法。 请注意,段应该是小写的(所以不要使用“Draws”)

://[:]////
  • 方案(如http)
  • 主机是完全限定的主机名,是一个DNS别名,用于隐藏设备和API实现的物理位置。当环境是非生产性环境(test,int)时,它包含有关该环境的信息
  • 端口应该是默认的http端口(80),因此可以省略。其他端口可用于非生产性环境
  • api路径将REST api与服务器提供的其他资源(例如webapp)分开。它通常采用/api的形式。对于只提供RESTAPI的服务器,可以省略它
  • api名称在一种包中收集一组资源。这是发布和版本控制的单元
  • api版本是api的版本。其格式为v[主要版本号]
  • 资源路径由资源URI段组成

Draws是应用服务器中服务的url上下文。然后绘制是为资源绘制实体。但是这里有一些人认为服务将返回的唯一东西是draws,并且由于上下文已经被绘制,服务的api不需要以“draws”开头,但对我来说,这是服务的资源。上下文(服务的名称)根本不重要,您不需要为servlet上下文加上名称。将其保留为“/”。那么您将如何解决两个不同的服务在同一主机和端口上作为一个资源的问题呢?这只是一个选项。但是您是否有两个不同的服务具有相同的“draws”实体?还是使用不同的“绘制”实体?如果有两个不同的“draws”实体,那么您的实体应该不同于“draws”,可能是“Xdraws”。在我看来,实体名称不必与资源名称相同,即使这样看起来更好。draws是服务的名称,服务的上下文。将自动添加到应用程序服务器中。“draws”实际上是同一个服务中的一个端点。与我的唯一区别是,您实际上添加了api版本。我忽略了api路径,因为它在我的例子中并不重要。关于api版本,我们已经就它是否应该在Accept标头或url中进行了大量讨论,但尚未决定。不确定swagger在标题中处理版本控制的效果如何。在我的例子中,Api名称是Draws,这是服务的名称,资源名称也是Draws。这是nice@clementino,你能提供资源吗?如果上下文永远不会公开,你为什么要让
Draws
两次?它是在内部公开的,永远不要给最终用户。那么,为什么不更改上下文名称以避免绘制两次?我的意思是,服务和项目的名称是Draws。上下文是由应用服务器添加的服务的名称。所有服务不能位于同一个基本url上。您的外部用户将看到哪个url?
<scheme>://<host>[:<port>]/<api-path>/<api-name>/<api-version>/<resource-path>