dvanderburg/silex-batched-request

Silex中批量请求的服务提供者。

v0.0.3 2017-08-30 16:31 UTC

This package is not auto-updated.

Last update: 2024-09-28 19:26:00 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

Silex服务提供者,用于执行批量请求。使用和实现大致基于Facebook的Graph API中的批量请求

批量请求允许您一次发送多个请求,使您可以在单个HTTP请求中执行多个操作。除非指定了依赖项,否则批量中的每个请求都将按顺序处理。

批量中的请求可以列出对批量中其他请求的依赖,并通过JSONP语法访问它们的响应。再次,类似于Facebook的Graph API。使用JSONP语法,批量中的一个请求可以使用批量中另一个请求的响应。一旦所有请求都已完成,将返回一个包含响应的数组,并关闭HTTP连接。

指定依赖项允许批量中的一个请求利用批量中另一个请求的响应。这通过使用JSONP语法来实现。更多详细信息请参阅使用和示例部分。

在PHP 5.6上构建和测试,与Silex版本2兼容。

依赖项

安装和设置

通过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请求失败,检索书籍的请求也会失败。

局限性

批处理请求在防火墙安全之后处理,这意味着您无法使用防火墙规则保护单个请求。建议批处理请求都位于需要身份验证的防火墙之后,或者每个单个请求都检查用户身份验证和权限。