在Guzzle 6中读取大型JSON API响应的正确方法是什么?

问题描述 投票:0回答:1

我目前具有以下Guzzle 6实现,返回包含用户数据的JSON数据流:

$client = new GuzzleHttp\Client([
        'base_uri' => 'https://www.apiexample.com',
        'handler' => $oauthHandler,
        'auth'    => 'oauth',
        'headers' => [
            'Authorization' => 'Bearer xxxxxxxxxxxxxx',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
]);

$res = $client->post('example');
$stream = GuzzleHttp\Psr7\stream_for($res->getBody());

JSON响应如下:

{
    "name": "Users",
    "record": [
        {
            "title": "Consulting",
            "_name": "Users",
            "end date": "07/03/2020",
            "session number": "1",
            "start date": "09/02/2019",
            "course id": "2900",
            "first name": "John",
            "unique user number": "123456",
            "time": "08 AM",
            "last name": "Doe",
            "year": "19-20",
            "location name": "SD"
        },
        .........
     ],
     "@extensions": "activities,corefields,u_extension,u_stu_x,s_ncea_x,s_stu_crdc_x,c_locator,u_userfields,s_edfi_x"
 }

正在为使用不同API端点的许多客户端运行。他们中的许多人返回太多用户,无法将整个JSON响应立即加载到RAM,这就是为什么我使用流的原因。

[可能有一种方法可以通过多次调用使API逐步返回块。但是从我从API开发人员那里获得的所有信息来看,这似乎打算作为一种流式响应来使用。

我对必须像这样流式传输API响应感到陌生,并且想知道将要遍历记录的正确方法是什么?查看Guzzle 6文档,看来迭代是通过选择字符串中的数字x字符并抓住该小节来进行的:

http://docs.guzzlephp.org/en/stable/psr7.html#streams

use GuzzleHttp\Psr7;

$stream = Psr7\stream_for('string data');
echo $stream;
// string data
echo $stream->read(3);
// str
echo $stream->getContents();
// ing data
var_export($stream->eof());
// true
var_export($stream->tell());
// 11

我可能会写一些东西,通过模式匹配来解析子节中的字符串,并在响应过程中将数据增量写入磁盘。但是这似乎容易出错,并且将成为Guzzle 6的一部分。

您能否提供一个示例,说明类似的东西应该如何工作,或者指出我可能缺少的地方?

谢谢,谢谢!

php json guzzle guzzle6
1个回答
1
投票

但是似乎这容易出错,并且是Guzzle 6的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.