设计RESTAPI以在单个查询字符串中接受多个复合标识符

设计RESTAPI以在单个查询字符串中接受多个复合标识符,rest,api,get,Rest,Api,Get,我需要设计一个API端点,它接受GET请求的复合标识符列表 假设标识符是这两个属性的组合: 类型-int-可以有多个关联的ID id-int-可以属于多种类型 假设客户机想要查询以下项目: 第10类,id 99 第10类,id 98 第11类,识别号89 第12类,识别号79 设计这个的标准方法是什么 我一直在考虑的一些选择 单个查询字符串参数,应具有显式顺序的type:id /endpoint?typeid=10:99&typeid=10:98&typeid=11:89&typeid

我需要设计一个API端点,它接受GET请求的复合标识符列表

假设标识符是这两个属性的组合:

  • 类型-int-可以有多个关联的ID
  • id-int-可以属于多种类型
假设客户机想要查询以下项目:

  • 第10类,id 99
  • 第10类,id 98
  • 第11类,识别号89
  • 第12类,识别号79
设计这个的标准方法是什么

我一直在考虑的一些选择

  • 单个查询字符串参数,应具有显式顺序的
    type:id

    • /endpoint?typeid=10:99&typeid=10:98&typeid=11:89&typeid=12:79
  • 单个查询字符串参数,为组合的每个部分显式调用参数

    • /endpoint?q=type:10+id:99&q=type:10+id:98&q=type:11+id:89&q=type:12+id:79
  • 与2相同,但以逗号分隔

    • /endpoint?q=type:10+id:99,type:10+id:98,type:11+id:89,type:12+id:79

  • 使用查询参数是请求对实体进行服务器端筛选的“标准”方法

    参数格式完全由您决定,因此,基本上,您的所有选项都没有错误。由于REST是关于统一接口的,所以您可以推断简单性和无歧义性是可取的。因此,你应该更喜欢简单明了的东西

    在您的选项中,我会选择数字1,但这是基于参数名称的个人偏好(它带有更多的“语义”)

    您当然知道,当您需要执行非常复杂的筛选时,查询参数并不总是很好的。另一种方法是设计“filterRequest”资源并使用POST与之交互

    操作的意义是:

  • 我向服务器提交一个过滤请求(比如,我打开一个票证:“请给我那些符合我标准的资源”)
  • 服务器处理请求并返回我想要的列表
  • 如果您计划添加更多过滤选项(这样可以增强可扩展性和重用性),那么这个选择可能是值得的。相反,您会发现自己在与一个容易变得不可读的查询作斗争