【问题标题】:how to publish multiple rest endpoints with same base address?如何发布具有相同基地址的多个休息端点?
【发布时间】:2017-06-27 08:06:26
【问题描述】:

首先是我们的场景:

我们有一个 OSGI 环境,其中几个包发布自己的休息端点,例如:

http://localhost:8080/api/cars
http://localhost:8080/api/food
http://localhost:8080/api/toys

这是使用 JAXRSServerFactoryBean.create() 方法完成的,地址是上面列出的。

现在我们需要为用户请求添加一个租户 ID(不是用户身份验证,这是不同的,因为用户可能是多个租户的一部分)。 URL 应如下所示:

http://localhost:8080/api/tenant/{tenantid}/cars
http://localhost:8080/api/tenant/{tenantid}/food 
http://localhost:8080/api/tenant/{tenantid}/toys 

我现在尝试了两种方法来实现这一点:

  1. 将租户 ID 添加到服务地址 (http://localhost:8080/api/tenant/{tenantid}) - 结果:我可以在给定的 URL 下访问我的服务,但我无法为租户 ID 填写任何数据,但必须输入URL 中的 {tenantid},这不是我需要使用它的方式。
  2. 在同一 URL (http://localhost:8080/api) 下发布所有三个服务,将租户部分移动到每个 api 类的 @Path 注释 - 结果:异常,该地址已被其他端点占用

有没有人知道如何正确地做到这一点?我知道 ServiceBean 可以将一组实现者作为参数而不是单个类,但这不是一个选项,因为捆绑包是单独加载的,并且当我尝试将其设置为“一体式”时,我遇到了一些依赖性问题。

作为旁注:我知道,我们可以将租户 ID 放在标题中,但通常租户信息位于 URL(主机或路径)中的某个位置,我们希望使用这种“通用”样式而不是添加自定义标题,虽然标题样式的实现会容易得多(已经让它工作了)。

任何想法都会有所帮助。 谢谢, 凯

【问题讨论】:

  • 还有什么想法吗?我们将使用查询参数来完成它,这是我们试图避免的......

标签: java rest jax-rs osgi restful-url


【解决方案1】:

尝试类似:

@Path("/tenants")
public class TenantResource{

    @Path("/{tenantId}/cars")
    @Get
    public List<Car> getTenantCars(@PathParam("tenantId") long tenantId){...}

    @Path("/{tenantId}/food")
    @Get
    public Food getTenantFood(@PathParam("tenantId") long tenantId){...}

    @Path("/{tenantId}/toys")
    @Get
    public List<Toy> getTenantToys(@PathParam("tenantId") long tenantId){...}
}

如果您有诸如 tenants/{tenantid}/cars 之类的 URL,那么这通常表示“id = tenantid 的租户的汽车”。

“cars”是“租户”资源的一个属性,因此应该在同一个资源中。 我认为模块化资源/对象的属性可能很困难。

但您可以考虑使用“汽车”资源并像这样查询资源:/cars?tenantid={tenantid}

@Path("/cars")
public class CarResource{

    @Get
    public List<Car> getCarsByTenantId(@QueryParam("tenantId") long tenantId){...}

}

或类似的。

【讨论】:

  • 我知道这些解决方案会起作用,但我的端点只是一些示例,“汽车”是 CRUD 操作的根源以及更详细的信息 - 例如 /cars/sensors/temperature/ 或 /汽车/轮胎/压力 - 将所有这些东西挂在“/tenants”下会将您提议的 TenantResource 类炸毁为 60 多种方法(而不是 3 个单一资源类中的每一个...... 至于查询参数:正如我说还有 CRUD 操作,包括 POST、DELETE 和 PUT,因此查询参数不是一个选项。
猜你喜欢
  • 2017-11-13
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多