marmelab/silex-multifetch

此包已被废弃且不再维护。未建议替代包。

Silex Provider 为您的应用程序添加多获取功能

dev-master / 1.0.x-dev 2019-05-04 07:42 UTC

This package is not auto-updated.

Last update: 2020-03-06 16:28:19 UTC


README

archived 存档仓库
此代码已不再维护。请随意分支,但请自行承担风险。

Marmelab Silex Multifetch

Multifetch 是一个 Silex Provider,它为任何 Silex 项目添加多获取功能。基于 Facebook 的批量请求哲学

安装

使用 Composer 在您的项目中安装此包

composer require marmelab/silex-multifetch "~1.0@dev"

在您的应用程序中启用 HttpFragmentServiceProvider

$app->register(new Silex\Provider\HttpFragmentServiceProvider());

$app->register(new Marmelab\Multifetch\MultifetchServiceProvider(), array(
    'multifetch.url' => 'multi', // this is the default value
    'multifetch.methods' => array('POST'), // this is the default value
    'multifetch.parallel' => false, // this is the default value
    'multifetch.headers' => true, // this is the default value
));

使用

向 Provider 监听的路由(默认为 '/multi')发送请求,并将要获取的请求作为 JSON 对象传递到请求体中。例如,要使用单个 HTTP 请求获取 /products/1/users,请发出以下请求

POST /multi HTTP/1.1
Content-Type: application/json
{
    "product": "/products/1",
    "all_users": "/users"
}

Provider 将调用两个 HTTP 资源,并在所有请求获取完毕后返回一个复合响应体

{ 
    "product": {
        "code": 200,
        "headers": [
            { "name": "Content-Type", "value": "application/json" }
        ],
        "body": "{ id: 1, name: \"ipad2\", stock: 34 }"
    },
    "all_users": {
        "code": 200,
        "headers": [
            { "name": "Content-Type", "value": "application/json" }
        ],
        "body": "[{ id: 2459, login: \"paul\" }, { id: 7473, login: \"joe\" }]"
    },
}

多获取请求中存在的任何标题将自动添加到所有子请求中。

请求方法

默认情况下,'/multi' 路由只监听 POST 请求。但是,您可以配置 Provider 接受 GET 请求。要启用它,只需将 Provider 配置 multifetch.methods 设置为 array('GET')

Provider 将读取查询参数以确定要获取的请求

GET /multi?product=/product/1&all_users=/users HTTP/1.1

如果您想同时启用 POSTGET 路由,请将 multifetch.methods 的值设置为 array('POST', 'GET')

并行请求

为了能够使用并行获取功能,您必须安装 Parallel.php 库。使用 Composer 安装它

composer require tiagobutzke/phparallel "~0.1"

如果添加了 _parallel 参数,多获取请求可以并行获取子请求

POST /multi HTTP/1.1
Content-Type: application/json
{
    "product": "/products/1",
    "all_users": "/users",
    "_parallel": true
}

您还可以,如果需要,通过将 Provider 参数 'mutltifetch.parallel' 设置为 true 来为所有查询启用并行获取。在这种情况下,如果您只想禁用单个查询的并行获取,您可以这样做

POST /multi HTTP/1.1
Content-Type: application/json
{
    "product": "/products/1",
    "all_users": "/users",
    "_parallel": false
}

警告parallel 选项为每个子请求创建一个新线程,这可能在某些使用场景中比顺序执行所有请求更快,具体取决于您的使用场景和子请求中的 I/O 操作量。

从响应中移除标题

您可能希望为了提高效率而从响应中移除 headers。在您的查询中将 _headers 参数设置为 false

POST /multi HTTP/1.1
Content-Type: application/json
{
    "product": "/products/1",
    "all_users": "/users",
    "_headers": false
}

您还可以通过在 Provider 配置中将 multifetch.headers 设置为 false 来为您所有的查询从响应中移除 headers

错误

可能您的请求操作之一会抛出错误。将返回类似的响应,但带有自定义的状态和正文。成功的请求将按正常方式返回,状态码为200。

以下是一个响应示例

POST /multi HTTP/1.1
Content-Type: application/json
{
    "product": "/products/1",
    "all_users": "/non_existing_route",
    "single_user": "/users/brian" // will trigger a 500 error
}
{
    "product": {
        "code": 200,
        "headers": [
            { "name": "Content-Type", "value": "application/json" }
        ],
        "body": "{ id: 1, name: \"ipad2\", stock: 34 }"
    },
    "all_users": {
        "code": 404,
        "headers": [],
        "body": "{ error: \"No route found for \\\"GET \\\/non_existing_route\\\"\", type: \"NotFoundHttpException\" }"
    },
    "single_user": {
        "code": 500,
        "headers": [],
        "body": "{ error: \"Oops! Something went wrong.\", type: \"InternalServerError\" }"
    },
}

测试

使用以下命令运行测试套件

make install
make test

许可证

Silex Multifetch是在MIT许可证下授权的,由marmelab提供。