agpopov / lumen-batched-request
Lumen框架(Laravel PHP)中批量请求的服务提供商。
Requires
- php: ^8.1
- laravel/lumen-framework: ^9.0
- softcreatr/jsonpath: ^0.8.0
Requires (Dev)
- phpunit/phpunit: ^9.3
This package is auto-updated.
Last update: 2024-09-21 12:09:57 UTC
README
Lumen服务提供者,用于执行批量请求。使用和实现大致基于Facebook Graph API的批量请求。
批量请求允许您一次发送多个请求,从而允许您在一个HTTP请求中执行多个操作。除非指定了依赖关系,否则批量中的每个请求都将按顺序处理。
批量中的请求可以列出对批量中其他请求的依赖,并使用JSONP语法访问它们的响应。同样,类似于Facebook的Graph API。使用JSONP语法,批量中的请求可以使用批量中另一个请求的响应。更多详细信息请参见使用和示例部分。
所有请求完成后,将返回一个响应数组,并关闭HTTP连接。
基于PHP 7.1.13和Laravel框架Lumen(5.6.3)构建。
依赖项
- PHP >=7.1 在PHP 7.1.13上构建和测试
- Laravel/Lumen ~5.6 原始构建使用Laravel Lumen版本5.6.3(https://github.com/laravel/lumen)
- FlowCommunications/JSONPath ~0.4.0 适应JSONP解析以指定依赖关系(https://github.com/FlowCommunications/JSONPath)
安装和设置
通过 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)认证作为头部信息发送,将在批次中的所有子请求上设置该头部信息,这意味着任何认证中间件将为批次中的每个请求执行。