earthit/cmip-rest

集合修饰符-ID-属性REST框架


README

Build Status

CMIP REST

使用模式定义处理CMIP风格的(见下文)REST请求。

CMIP是什么鬼

REST服务的约定。

URL形式为/<collection>[;<modifiers>][/<identifier>[/<property>]],因此称为'CMIP'。

它还支持一些其他风格,将它们映射到相同的基本操作。

有五个基本操作:搜索、获取、发布、放置、修补、删除。

  • GET /<collection>[;<modifiers>][?<filter>]返回集合中对象的列表。返回的确切子集由<filter>(见'集合过滤器')确定,每个对象如何表示由<modifiers>(见'记录修饰符')确定。
  • GET /<collection>[;<modifiers>]/<id>返回由id标识的集合中的单个对象。
  • POST /<collection>将新记录添加到集合中。新记录作为请求中的JSON编码列表提供。如果POST的条目包含主键,它们可能与现有条目冲突,在这种情况下,这些条目将像对那些条目执行修补操作一样更新。
  • PUT /<collection>/<id>使用请求内容中提供的JSON数据替换记录。未提供值的字段将重置为其默认值。
  • PATCH /<collection>/<id>使用请求内容中提供的JSON数据更新记录。未明确提到的字段保留其旧值。
  • DELETE /<collection>/<id>删除记录。
  • DELETE /<collection>?<filters>删除匹配过滤器的记录。

记录修饰符

修饰符指示如何构建结果对象。`with`修饰符是一个以逗号分隔的列表,指示应与每个记录一起返回哪些相关对象。例如,路径`/authors;with=books`表示返回与每个作者记录一起返回的书籍列表,而路径`/books;with=author,publisher`表示与每个书籍记录一起返回单个作者和出版社。

可以使用点来分隔路径组件以请求额外的嵌套级别。例如,`/authors;with=books.publisher.postalAddress`获取作者列表,每个作者都包含一个包含所有书籍的列表,每个书籍都包含一个带有'postalAddress'子记录的'publisher'记录。生成的JSON可能看起来像这样:

[
  {
    "id": 154,
    "name": "Some Author",
    "books": [
      {
        "id": 301,
        "title": "A Book Containing Words",
        "publisher": {
          "id": 4,
          "name": "Some Book Publishing Company",
          "postalAddress": {
            "streetAddress1": "450 Some Street",
            "localityName": "Someville",
            "regionCode": "SC",
            "postalCode": "12345"
            "countryCode": "USA",
          }
        }
      },
      ...more book records maybe go here...
    ]
  },
  ...more author records maybe go here...
]

集合过滤器

除少数保留参数外,集合GET请求的查询参数对应于集合中条目的字段。

保留参数是

  • orderBy=[+-]<fieldName>... - 指示结果的排序顺序
  • limit=[<skip>,]<count> - 指示要跳过和包含的结果集的行数

字段匹配参数值可以是以下格式之一

  • <pattern> - 匹配模式,其中*代表任何子串。仅当模式不包含冒号时有效。如果给定的模式不包含任何星号,则可以优化为精确匹配。
  • eq:<value> - 完全匹配值
  • like:<pattern> - 基于模式匹配字符串,其中*代表任何子串
  • lt:<value> - 匹配小于给定值的值
  • gt:<value> - 匹配大于给定值的值
  • in:<list> - 匹配逗号分隔列表中提到的任何值
  • is:null - 匹配null值
  • not: - 取消过滤,例如:not:is:nullnot:like:*foo*

搜索参数将根据匹配的字段自动解析为适当的格式(例如,如果存在一个字段 someNumericField 被标记为包含数字,搜索 someNumericField=eq:5 被解释为等于数字5,而不是字符串 "5")

集合-表格映射

在将数据库记录转换为REST形式时,所有主键值都合并为单个 id,多个字段由破折号分隔。

在解析URL或JSON中给出的ID时,必须将其转换为组成部分字段。即使数据库记录中实际上只有一个ID字段,来自JSON或URL的ID数据也必须转换为正确的类型。

在加载和存储时,字段名可以在命名约定之间转换。Postgres中的表格和列的命名约定似乎是使用压缩在一起的小写字母。

在REST服务公开的视图中

  • 集合名称由破折号分隔(例如 patient-stays
  • 字段名,在URL(修饰符和搜索参数)以及请求/响应JSON数据中,都是驼峰式(例如 patientAdmissionDate

本项目的目标之一是使覆盖这些约定变得简单,并允许针对不同事物的不同视图进行特殊处理。例如,一个类可以公开为 super-duper-car-washes,但支持表实际上可以称为 x_okaycarwash

待办事项:添加使用此库的PHP示例。