agpopov/lumen-batched-request

Lumen框架(Laravel PHP)中批量请求的服务提供商。

1.0.0 2022-02-28 10:42 UTC

This package is auto-updated.

Last update: 2024-09-21 12:09:57 UTC


README

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

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

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

批量中的请求可以列出对批量中其他请求的依赖,并使用JSONP语法访问它们的响应。同样,类似于Facebook的Graph API。使用JSONP语法,批量中的请求可以使用批量中另一个请求的响应。更多详细信息请参见使用和示例部分。

所有请求完成后,将返回一个响应数组,并关闭HTTP连接。

基于PHP 7.1.13和Laravel框架Lumen(5.6.3)构建。

依赖项

安装和设置

通过 composer 安装此包。

composer install dvanderburg/lumen-batched-request

在app.php中注册服务提供者

$app->register(Dvanderburg\BatchedRequest\BatchedRequestServiceProvider::class);

简单的批量请求

通过向 /batch/ 发送HTTP POST来发送基本的批量请求。此示例将执行两个GET请求和一个POST请求,并返回一个响应数组。

HTTP POST示例

POST /batch HTTP/1.1
Content-Type: application/json
batch: [
	{ method: "GET",	relative_url: "/product/1234" },
	{ method: "GET",	relative_url: "/user/?ids=larry,jill,sally" },
	{ method: "POST",	'content-type': "application/x-www-form-urlencoded", name: 'create-user', relative_url: "/user/?username=john" body: "password=admin"},

Axios XHR示例

axios.post('/batch', {
	batch: [
		{ method: "GET",	relative_url: "/product/1234" },
		{ method: "GET",	relative_url: "/user/?ids=larry,jill,sally" },
		{ method: "POST",	'content-type': "application/x-www-form-urlencoded", name: 'create-user', relative_url: "/user/?username=john" body: "password=admin"},
	]
});

JQuery XHR示例

$.ajax({
	method: "POST",
	dataType: "json",
	data: {
		batch: [
			{ method: "GET",	relative_url: "/product/1234" },
			{ method: "GET",	relative_url: "/users/?ids=larry,jill,sally" },
			{ method: "POST",	'content-type': "application/x-www-form-urlencoded", name: 'create-user', relative_url: "/user/?username=john" body: "password=admin" },
		]
	}
})

上述示例中,预期的响应格式将是

[
	{
		code: 200,
		body: { product_id: 1234 }
	},
	{
		code: 200,
		body: [{ username: "larry" }, { username: "jill" }, { username: "sally" }]
	},
	{
		code: 200,
		body: { username: "john" }
	},
]

错误

如果批量中的某个请求失败,其响应数组中的响应将包含非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": "/book/?book_ids={result=get-user-books:$.book_id}" },

在上面的示例中,批量中的第一个请求被命名为get-user-books,第二个请求通过名称引用该请求并使用JSONP语法提取第一个请求中的所有book_ids,以确定要检索哪些书籍。

JSONP表达式的结果以csv格式导出。在上面的示例中,这可能看起来像:1234,5678,9012

如果某个请求是另一个请求的依赖项并且失败,它将导致依赖于它的请求也失败。在上面的例子中,如果获取用户书籍(get-user-books)请求失败,检索书籍的请求也将失败。

头部信息、Cookies和文件

与到/batch/的HTTP请求相关的头部信息、Cookies和文件将可供批次中的所有请求使用。例如:将承载令牌(bearer-token)认证作为头部信息发送,将在批次中的所有子请求上设置该头部信息,这意味着任何认证中间件将为批次中的每个请求执行。