qbnk/restler

luracast/restler 的分支,并添加了自己的功能。

3.1.0 2020-07-07 13:28 UTC

README

![Gitter](https://badges.gitter.im/Join Chat.svg) 最新稳定版本 总下载量 最新不稳定版本 许可证

版本 3.0 发布候选版 5

Restler 是一个简单有效的多格式 Web API 服务器,用 PHP 编写。

只需在 PHP 中处理您的业务逻辑,Restler 会处理 REST!

如果您服务器上没有 PHP >= 5.3.2 并且无法升级,可以使用 Restler 2 代替

Restler 3 - 通过设计提升 API

特性

  • 无学习曲线
  • 轻量级
  • 灵活
  • 高度可定制
  • 许多示例,您可以在本地主机上尝试以开始使用
  • 支持通过头部或请求参数(方法)发送和接收 HTTP 请求方法 HEAD、GET、POST、PUT、DELETE、OPTIONS 和 PATCH
  • 支持 RESTful 和实用 REST API 设计
  • 客户端可以使用 X-HTTP-Method-Override 头部,支持跨源资源共享和 JSONP
  • 双向格式(媒体类型)转换,发送和接收
    • 可插拔的内容格式化框架和 API
    • 包含 JSON、XML、Yaml、Amf 和 Plist(XML 和二进制)格式支持
  • 可插拔的认证方案
    • OAuth 2 服务器
  • 可插拔的过滤器以有效地管理 API 使用
    • API 速率限制过滤器
  • 路由
    • 手动路由(注解)
      • 使用 @url GET my/custom/url/{param} PHPDoc 注释
    • 自动路由(反射)
      • URL 到方法的映射
      • URL 部分到方法参数的映射
      • 查询参数到方法参数的映射
      • 请求体到方法参数的映射
      • [计划中] 头部到方法参数的映射
  • 内置缓存
    • 客户端缓存支持
    • 代理缓存支持
    • 服务器端缓存
      • [计划中] ETag、If-None-Match 支持
      • [计划中] Last-Modified、If-Modified-Since 支持
  • API 特性
    • 始终支持 URL 编码格式以简化输入(POST 变量)
    • 自动参数验证和类型转换
    • 支持通过 URL 和/或供应商特定的 MIME 进行 API 版本控制
    • 使用 Restler API 探索器 进行 API 文档和发现
    • 节流和性能调整
  • 管理

Git仓库和分支

  1. 最稳定和最新的版本维护在master分支,之前的版本保存在如v1v2这样的分支中

  2. 包含当前版本(如v3)的版本分支用于构建下一个版本。其文档可能不会频繁更新,因此仅供勇敢者使用。

  3. 功能分支(如features/htmlfeatures/router)纯粹用于实验目的,尝试一个功能

安装

请确保您的服务器上安装了PHP 5.3.2或更高版本(至少推荐使用5.3.4以避免潜在的错误)

1. 安装Composer

Restler使用Composer来管理其依赖项。首先,下载一份composer.phar副本。它可以保存在您的项目文件夹中,或者在理想情况下保存在usr/local/bin中以在所有项目中全局使用。如果您使用Windows,可以使用windows安装程序

2. 安装Restler

选项1:使用composer create-project

您可以通过在终端中运行创建项目命令来安装Restler。用您的实际项目名称替换{projectName}。它将创建一个具有该名称的文件夹并安装Restler。

php composer.phar create-project luracast/restler {projectName}

注意:

  1. 如果您不希望包含额外的格式和行为驱动工具,可以在命令中包含--no-dev以强制排除开发包。

  2. 如果您想尝试bleading edge v3分支或任何功能分支,在上述命令中包含3.x-devdev-features/html

选项2:从GitHub下载

安装Composer后,下载Restler框架的最新版本,并将其内容提取到您的服务器上的一个目录中。接下来,在Restler项目的根目录中,运行php composer.phar install(或composer install)命令以安装框架的所有依赖项。此过程需要服务器上安装Git以成功完成安装。

如果您想更新Restler框架,可以发出php composer.phar update命令。

注意:如果您无法在服务器上安装composer和git,您可以在您的开发机器上安装并运行它们。生成的文件和文件夹可以上传并在服务器上使用。

3. 配置

理想情况下,公共文件夹应映射为您的Web根目录,这虽然是可选的,但建议这样做以避免暴露不必要的文件和文件夹。

4. 尝试使用

在本地主机中尝试实时示例

运行一些测试

更新behat.yml中指定的base_url,然后尝试以下命令


bin/behat

这将测试预期行为,例如


Feature: Testing CRUD Example
    Scenario: Creating new Author with JSON
        Given that I want to make a new "Author"
        And his "name" is "Chris"
        And his "email" is "chris@world.com"
        And the request is sent as JSON
        When I request "/examples/_007_crud/authors"
        Then the response status code should be 200
        And the response should be JSON
        And the response has a "id" property

一切准备就绪,快乐地使用Restler! :)

快速入门指南

按照以上步骤安装Restler后,您可以按照以下步骤快速创建应用程序

1. 编写API

创建您的所有所需公共和受保护方法的API类

2. 打开网关

创建以下gateway (index.php)

<?php
require_once '../../../vendor/restler.php';
use Luracast\Restler\Restler;

$r = new Restler();
$r->addAPIClass('YourApiClassNameHere'); // repeat for more
$r->handle(); //serve the response

3. 美化URL

启用URL重写

确保所有请求通过启用网站上的URL重写路由到index.php

例如:

如果您使用Apache,可以使用以下.htaccess文件

DirectoryIndex index.php
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^$ index.php [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
<IfModule mod_php5.c>
    php_flag display_errors On
</IfModule>

注意: 这需要在 httpd.conf 文件中将 AllowOverride 设置为 All 而不是 None,并且可能需要调整某些服务器配置。有关更多信息,请参阅 mod_rewrite 文档。

如果您使用的是 Nginx,请确保已设置 server_name 并将 PHP 脚本传递给监听 127.0.0.1:9000 的 fast cgi (PHP-FPM)。

server {
        listen        80;
        server_name   api.luracast.com; //change it to match your server name

        //... other stuff

        location ~ \.php$ {
            root           /var/www/html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
            include        fastcgi_params;
        }

        //... other stuff

}

注意: 这需要正确安装和配置 PHP、PHP-FPM。有关更多信息,请参阅 PHP FastCGI 示例。

4. 自定义

调整以满足您的需求

<?php
require_once '../../../vendor/restler.php';
use Luracast\Restler\Restler;
use Luracast\Restler\Defaults;
//set the defaults to match your requirements
Defaults::$throttle = 20; //time in milliseconds for bandwidth throttling
//setup restler
$r = new Restler();
$r->addAPIClass('YourApiClassNameHere'); // repeat for more
$r->addAPIClass('Resources'); //from restler framework for API Explorer
$r->addFilterClass('RateLimit'); //Add Filters as needed
$r->handle(); //serve the response

如果您已成功完成安装步骤 2,则应在 vendor/Luracast/explorer 文件夹中安装了 Restler API Explorer。创建 vendor/Luracast/explorer/dist 的符号链接或复制该文件夹并将其命名为 explorer

将 explorer 放在与 index.php 相同的文件夹中

通过在浏览器中打开 Web 根目录下的 explorer/index.html 来探索 API 并尝试它

祝您探索愉快! :)

注意: 使用 eAccelerator 可能会使 Restler 失败,因为它会删除注释。更多信息请参阅 此处

5. 注释

Restler 支持 API 微调的 PHPDoc 注释形式的注释

它们在 注释 部分中有详细说明

6. 授权

为了保护您的 API,请进行身份验证并允许有效的用户

<?php
require_once '../../../vendor/restler.php';
use Luracast\Restler\Restler;
$r = new Restler();
$r->addAPIClass('YourApiClassNameHere'); // repeat for more
$r->addAuthenticationClass('CustomAuth'); //Add Authentication classes as needed
$r->handle(); //serve the response

7. 开始生产

默认情况下,Restler 以调试模式运行,更侧重于 API 开发者,通过显示详细的错误消息并将 API 结果格式化为人可读的形式

通过开启生产模式,您将获得一些性能提升,因为它将缓存路由(注释解析仅在每次 API 调用时发生一次),一些其他文件,并避免提供调试信息

<?php
require_once '../../../vendor/restler.php';
use Luracast\Restler\Restler;

//setup restler

$r = new Restler(true); //turn on production mode by passing true.
//If you are using file based cache (the default) make sure cache folder is
//writable. when you make changes to your code make sure you delete the
// routes.php inside the cache folder
//...

变更日志

Restler 3.0 RC5

  • 添加了作用域(依赖注入容器)。它的注册方法允许添加具有依赖关系的 API 类。
  • 改进了 HtmlFormat 以支持 blade 模板,并使其易于扩展以添加您自己的模板。
  • HtmlFormat::$format 已重命名为 HtmlFormat::$template 以提高清晰度
  • HtmlFormat 现在支持自动模板化,根据映射的 URL 加载相关模板。
  • Tag,一个用于以面向对象方式生成 HTML 标签的实用程序类。
  • Emmet 类扩展了 emmet 的一部分以创建模板引擎。
  • Forms 类用于自动生成任何 API 方法的表单,预建在 HTML5、Twitter Bootstrap 3、Zurb Foundation 格式中。
  • Validator 改进以允许抑制验证错误立即抛出异常,这样 API 调用就可以到达 API 方法。
  • Validator 改进以更友好地支持表单验证。
  • Nav 类创建 HTML 导航界面。
  • OAuth 示例已更新,以使用 OAuth2 库的 1.0 版本。
  • 许多错误修复和改进。

Restler 3.0 RC4

  • API 方法参数中的 $request_data 和 Restler 实例上的 getRequestData() 现在排除了 $_GET 参数。
  • 从 API 方法返回 null 现在排除了响应体。此行为可以通过将 Defaults::$emptyBodyForNullResponse 设置为 false 来更改。
  • 在测试文件夹中添加了许多 API 示例,用于使用 BDD 逐个测试功能。
  • 支持自定义类参数和自定义类参数数组
  • 当参数是唯一参数时,可以直接将其作为请求体传递
  • 修复了 composer.json 并将稳定版本作为 composer 包发布到 packagist。
  • 添加了新的 Routes 类,改进了路由,包括通配符路由和基于参数类型的智能路由。
  • 支持使用任何自动加载器,包括composer的自动加载器,以实现最大程度的互操作性。
  • 将CFPropertyList迁移到使用rodneyrehm/plist包。
  • 移除了所需的包,因为它们并非真正意义上的“必需”,Restler开箱即用。
  • 创建支持的包作为require-dev,这些包将通过composer install --dev安装。
  • 为所有支持的包添加了建议部分。
  • 为包描述符添加了关键词。
  • 添加了分支别名,以表明v3是v3.0.x-dev的快照。
  • 将Restler作为包发布到packagist。

Restler 3.0 RC3

  • 添加了Defaults::$cacheDirectory以在单个中央位置设置缓存目录。
  • 通过扩展JsonFormat添加了JsFormat类以支持JSONP。
  • 修复了当请求体中发送的JSON不是对象或数组时的致命错误。
  • 通过在找到分隔符且标签不是@pattern时进行数组转换,改进了内联注释的解析。
  • 重写了RateLimit类以支持所有时间单位second|minute|hour|day|week|month,以实现更精细的控制。
  • 改进了Resources类,以包含对正文参数的描述。
  • 修复了Resources,当返回类型是自定义类的数组时,不会包含命名空间。
  • 修复了当当前API名称是另一个API的一部分时,资源不会包含另一个类的API的问题。
  • 添加了两种排除API的方法。
    • Resources::$excludedHttpMethods(数组)
    • Resources::$excludedPaths(数组)
  • 修复了PHP < 5.4中的未转义Unicode错误。
  • 修复了解析ValidationInfo的@choice内联注释时的错误。
  • 添加了对字符集的支持。
  • 添加了对(基本)语言的支持。
  • 更新了BDD测试以包含新功能。
  • 修复了Restler类中的一个bug,该bug会影响Defaults的$_GET覆盖。
  • 修复了XmlFormat解析XML内容到数组时的bug。
  • 通过JsonFormat的jsFormat扩展添加了对JSONP的支持。
  • 修复了PHP < 5.4中JsonFormat的Unicode未转义bug。
  • 修复了顺序,以便在编码响应之前调用responseFormat->setCharset。
  • 改进了文档并修复了少量bug。

Restler 3.0 RC2

  • 筛选类可以使用认证状态,通过实现iUseAuthentication接口,对认证用户做出不同的响应。
  • 添加了RateLimit类以限制API的使用。
  • 修复了setCompatibilityMode的bug。
  • 更新了Resources,以使用路径而不是类名进行资源标识。
    • 启用了文档的访问控制。
  • 修复了CommentParser以忽略重复的空白,从而正确解析注释。
  • 修复了@status和@expires标签的注释解析。
  • 添加了以下示例
    • 文档
    • 速率限制
    • 访问控制
  • CRUD示例已更新,包括PATCH支持

Restler 3.0

Restler 3.0完全重写自Restler 2.0,考虑到以下最佳实践

  • PHP编码
  • RESTful和/或实用REST
  • API设计

Restler 3.0

  • 使用命名空间、延迟静态绑定和闭包,因此它仅适用于PHP 5.3+(如果需要PHP 5.0+支持,请使用Restler 2
  • 向后兼容Restler 1和2。使用$r->setCompatibilityMode($version);
  • 支持混合API,为认证用户提供扩展数据。使用@access hybrid PHPDoc注释。
  • 默认情况下使用智能自动路由,其中API方法参数具有默认值不再映射到URL,而是映射到查询字符串,以减少URL中的歧义。
  • 支持以查询字符串的形式设置 suppress_response_codes,当设置为 true 时;所有 HTTP 响应将以 HTTP OK 返回,错误信息包含在响应体中,以适应移动设备和权限较低的客户端。
  • 改进了 CommentParser,增加了对多种格式嵌入数据的支持
    • 内联文档注释 {@name value}
    • 查询字符串参数 ``` param1=value¶m2=value2```
    • JSON ``` {"param1": value, "param2": value2}``` 可以放置在多行中
  • 包含具有静态属性的 Defaults 类,可以根据需要修改
  • 现在 iAuthenticate 使用 __isAllowed 方法而不是 __isAuthenticated,以便同一个类可以用于认证或过滤
  • 添加了 iUseAuthentication 接口,以帮助混合访问 API 方法和过滤器了解用户认证状态
  • 更新了 iFilter 接口,以提供字符集支持
  • ...(后续更多)

Restler 2.0

Restler 2.0 是一个重大重写,采用约定优于配置的原则,并针对性能进行了优化。以下是主要变更和改进

  • 将方法映射到 URI 的 PHPDoc 注释现在是可选的。
  • 所有不以下划线开头的公共方法都将自动映射到方法名(gateway\classname\methodname\param1\...
  • 如果我们没有指定 $restler->addAPIClass 的第二个参数,它将映射到类名,而不是映射到根目录
  • Restler 2 是为 PHP 5.3 及以上版本编写的,但它使用了 compat.php,可以在 PHP 5.0 及以上版本的任何 PHP 版本上运行