dvanderburg / silex-batched-request
Silex中批量请求的服务提供者。
Requires
- php: >=5.6.0
- flow/jsonpath: ~0.3.4
- silex/silex: ~2.0
This package is not auto-updated.
Last update: 2024-09-28 19:26:00 UTC
README
Silex服务提供者,用于执行批量请求。使用和实现大致基于Facebook的Graph API中的批量请求。
批量请求允许您一次发送多个请求,使您可以在单个HTTP请求中执行多个操作。除非指定了依赖项,否则批量中的每个请求都将按顺序处理。
批量中的请求可以列出对批量中其他请求的依赖,并通过JSONP语法访问它们的响应。再次,类似于Facebook的Graph API。使用JSONP语法,批量中的一个请求可以使用批量中另一个请求的响应。一旦所有请求都已完成,将返回一个包含响应的数组,并关闭HTTP连接。
指定依赖项允许批量中的一个请求利用批量中另一个请求的响应。这通过使用JSONP语法来实现。更多详细信息请参阅使用和示例部分。
在PHP 5.6上构建和测试,与Silex版本2兼容。
依赖项
- PHP >=5.6 在PHP 5.6上构建和测试
- Silex ~2.0最初使用Silex版本2.0.4构建(https://github.com/silexphp/Silex)
- FlowCommunications/JSONPath ~0.3.4 支持JSONP解析以指定依赖项(https://github.com/FlowCommunications/JSONPath)
安装和设置
通过composer安装此包。
composer install dvanderburg/silex-batched-request
将服务提供者注册为应用程序引导过程的一部分。
$app->register(new Dvanderburg\BatchedRequest\BatchRequestServiceProvider(), array( 'batchrequest.url' => "batch" // this is the default value ));
服务提供者配置
服务提供者可以配置以确定处理批量请求的URL。默认为/batch/
,这意味着要发送批量请求,您需要向类似https:///batch/
的URL发送POST请求。这可以被自定义,包括通过指定/
为batchrequest.url
来设置网站根目录。
简单的批量请求
通过向您为服务提供者配置的URL发送HTTP POST请求来发送基本的批量请求(默认为/batch/)。此示例将执行两个GET请求和一个POST请求,返回一个响应数组。如果您通过body参数发送表单数据,则需要指定内容类型(application/x-www-form-urlencoded或application/json)。
HTTP POST示例
POST /batch HTTP/1.1
Content-Type: application/json
include_headers: true,
batch: [
{ "method": "GET", "relative_url": "/products/1?one=1&two=2&three=3" },
{ "method": "GET", "relative_url": "/users/?ids=larry,jill,sally" },
{ "method": "POST", "content-type": "application/x-www-form-urlencoded", "name": "create-user", "relative_url": "/users/?username=john" "body": "password=admin"},
JQuery XHR示例
$.ajax({ method: "POST", dataType: "json", data: { include_headers: true, batch: [ { "method": "GET", "relative_url": "/products/1?one=1&two=2&three=3" }, { "method": "GET", "relative_url": "/users/?ids=larry,jill,sally" }, { "method": "POST", "content-type": "application/x-www-form-urlencoded", "name": "create-user", "relative_url": "/users/?username=john" "body": "password=admin" }, ] } })
对于上面的示例,预期的响应格式将是
[ { "code": 200, "headers": [ ... ], "body": [{ product_id: 1 }, { product_id: 2 }, { product_id: 3 }] }, { "code": 200, "headers": [ ... ], "body": [{ username: "larry" }, { username: "jill" }, { username: "sally" }] }, { "code": 200, "headers": [ ... ], "body": { username: "john" } }, ]
从响应中删除头部信息
可以通过在批量HTTP请求的数据中将include_headers
设置为false
来从响应中删除头部信息。如果没有指定,默认行为是返回每个响应的头部信息。
错误
如果批量中的某个特定请求失败,则其响应将在响应数组中包含非200代码。但是,处理批量的实际HTTP请求仍将返回200-OK。
使用JSONP指定依赖项
有时候,批次中一个请求的操作依赖于另一个请求的响应。这种依赖可以通过指定一个请求的名称,然后使用JSONP语法访问该请求的响应来创建。
以下示例检索一个用户的书籍集合,这些书籍用book_id
表示。然后,这些书籍ID被批次中的第二个请求用来检索这些书籍的信息。
HTTP POST示例
POST /batch HTTP/1.1
Content-Type: application/json
batch: [
{ "method": "GET", "name": "get-user-books", "relative_url": "/user_books/?username=larry" },
{ "method": "GET", "relative_url": "/books/?book_ids={result=get-user-books:$.book_ids.*}" },
在上面的示例中,批次中的第一个请求被命名为get-user-books,批次中的第二个请求使用JSONP语法从第一个请求中提取所有book_ids,以便知道要检索哪些书籍。
如果一个请求是另一个请求的依赖,并且失败,它将导致依赖它的请求也失败。在上面的示例中,如果get-user-books请求失败,检索书籍的请求也会失败。
局限性
批处理请求在防火墙安全之后处理,这意味着您无法使用防火墙规则保护单个请求。建议批处理请求都位于需要身份验证的防火墙之后,或者每个单个请求都检查用户身份验证和权限。