govtnz/silverstripe-api

使用接口和Swagger实现的SilverStripe外观模式API实现

安装: 1,165

依赖项: 0

建议者: 0

安全性: 0

星标: 1

关注者: 9

分支: 1

开放问题: 1

类型:供应商模块

1.0.0 2016-10-16 23:37 UTC

This package is auto-updated.

Last update: 2024-09-13 03:33:26 UTC


README

使用接口和可选Swagger实现的SilverStripe外观模式API实现。

Build Status Version License

简介

这是一个有观点的包,它实现了一个具有以下功能的SilverStripe API

  • 每个API节点都在PHP接口文件中进行了描述。
  • API从您的SilverStripe数据结构中抽象出来。

您可以根据对消费者的最大逻辑意义来结构化您的API:这是外观模式。

  • 可选的Swagger UI实例集成。
  • 每个接口的可选存根文件实现,用于测试。
  • 每个接口的实际实现可以分配给任何(一个)类。

在许多情况下,实现接口的类可能是一个现有的页面控制器,但您可以完全自由地有一个单独的类仅用于实现API接口。

此包正在由Govt.nz团队逐步开发,并且正在添加所需的功能。

这意味着一些期望的功能尚未实现。

例如,OAuth和权限检查只有在我们需要时才会添加。

快速入门

composer require govtnz/silverstripe-api

此模块中的/resources/data_dir子目录包含接口示例。

  1. 将整个子目录复制到合适的位置(见下面的API数据)。
  2. 运行dev/build
  3. 运行dev/tasks/ApiRebuildDefinitionsTask
  4. 在浏览器中,键入[WEBROOT]/api/v1/section/list ... 您应该看到正确格式的响应。

使用Swagger-UI或手动浏览assets/api/v1/swagger.json文件,了解其他可用的API请求。

配置

GovtNZ\SilverStripe\Api\ApiManager:
    api:
        v1:
            definition: 'path/to/base.txt'
            interfaces:
                - ApiInterfaceOne
            stubs
                - ApiInterfaceStubOne
        v2:
            definition: 'path/to/base.txt'
            interfaces:
                - ApiInterfaceOne
            stubs
                - ApiInterfaceStubOne

API定义

silverstripe-api 允许您将API定义分解为分布在多个文件中的块。

分割您的API定义不是强制性的:如果您愿意,您可以将其编写为单个块。但是,分割它提高了可维护性,并且开发任务API:重建定义仍将为每个API版本生成单个swagger.json文件。

但是您如何结构化您的API定义,它需要是

  1. 标准的JSON,
  2. 与Swagger 2.0规范一致,并且
  3. 包含在多行注释块中
    /* 
    
      (json here) 
      
    */
    

与常规JSON文件不同,您可以在API定义中包含//注释(但不要使用/* */注释)。这些//注释将被生成swagger.json输出的开发任务忽略。开发任务将假设每个JSON块是Swagger定义中的顶级元素:提供的示例演示了这一点。

Swagger JSON文件

开发任务API:重建定义从每个接口中提取JSON片段,并将它们构建成一个单一的swagger.json文件。

默认情况下,生成的swagger.json文件保存在/assets/api中,但您可以使用.yml配置设置来更改它

Swagger:
  data-dir: [PATH]

并且如果您将govtnz/swagger-ui与该API模块集成,则此路径必须是外部可访问的。

定义文件

每个API目录必须有一个文件,它定义了所有接口节点共有的属性。

在此文本文件中,有两个有用的变量可用于在开发、测试和生产服务器之间使API定义更便携

您可以使用getHost自动填充“host”键

"host": "<% getHost %>",

您可以使用getProtocol自动填充“schemes”数组

"schemes": [
    "<% getProtocol %>"
],

建议您复制并修改现有的 resources/base.txt 文件,以启动自己的 API 开发。

测试

可以编写自动化测试来测试每个接口及其存根文件。这些测试可以存储在 /tests 子目录中。

stubs 目录中的每个文件都使用静态数据实现 API 接口。它在以下两种情况下之一被调用:

  1. 当在 API 请求中添加 test 参数时,例如 &test=true
  2. 当没有其他 API 接口的实现时。

存根文件不是强制性的,但它们对测试很有用,因为它们的响应永远不会改变。

API 文档

ApiController 中有几个有用的函数

  • caseCamel($field) 确保字段 $field 是驼峰命名。
  • caseRequest($field) 确保字段 $field 符合请求中指定的格式(默认为驼峰命名)。简单的一个单词字段名在驼峰和蛇形命名法中相同,但更复杂的字段名可以在生成输出时通过此函数传递。
  • caseSnake($field) 确保字段 $field 是蛇形命名。
  • date3339toDB($input) 将 RFC3339 时间戳(2015-06-28T00:00:00+12:00)转换为 MySQL 格式(2015-06-28 00:00:00)。
  • dateDBto3339($input) 将 MySQL 时间戳(2015-06-28 00:00:00)转换为 RFC3339 格式(2015-06-28T00:00:00+12:00)。
  • formatOutput() 返回一个包含两个节点的数组:查询总数、计数和偏移量;之前分配给 output 的输出数据。
  • logAdd($text) 填充控制器的内部日志;有时对调试很有用。
  • logGet() 返回控制器的内部日志作为一个数组;有时对调试很有用。
  • param($name) 返回请求参数 $name,如果不存在则返回空字符串。
  • setError($params) 接受一个包含 status 值和一个或多个错误信息的数组。它更改控制器的状态并设置要返回的错误信息。
  • xmlAdd($key, $parent, $label) 为给定的键|父组合注册一个 XML 标签。可以使用星号 * 来表示数值。注册标签仅对通用规则的例外情况是必要的,即 XML 标签复数将通过添加 "s" 来创建。然而,一个重要的用例是一维数组,它将具有数字键。默认行为是将任何数字键转换为 "item",以防止 XML 解析错误,但具有上下文特定的标签会更好。

实现

您的实现代码可以

  • 依赖于字段名是驼峰命名。
  • 从控制器的 param() 函数中检索请求参数。
  • 使用 date3339toDB()dateDBto3339() 转换请求和响应日期。
  • 使用 xmlAdd() 注册 XML 节点的标签。
  • 如果无法处理请求,请调用控制器的 setError() 函数。

您的实现必须

  • 对任何超过简单一个单词名的输出字段调用 caseRequest()
  • 将生成数据作为数组分配给控制器的 output 属性。
  • 如果输出数据的类型与 API 节点的基类型不同,请设置控制器的 pronoun 属性。

例如,API 方法 organisation/sector 返回组织部门的列表,而不是组织的列表。在这种情况下,将 pronoun 设置为 sector,以便输出得到适当的描述。

Swagger 集成

有一个配套的包,govtnz/swagger-ui,它派生了 Swagger UI,使得在 SilverSripe 项目中包含它变得容易。

有关更多详细信息,请参阅此 配套 Swagger 包 中的文档。