92620


laravelで、検索結果をJSON出力するAPIを作成したのですが、出力するデータが多いため、分割でechoでデータを送信するよう作成しました。この場合、別の環境のphp内でそのAPIを実行し、データを全て受け取り、加工したいとき、どのように受け取ればいいでしょうか？  
(ブラウザで実行すると正常に取得できます)

PHPで下記を実行するとNULLが返ってきます。

[code]

    $http = new \GuzzleHttp\Client([~~]);
    $response = $http->post('URL' ~~
    var_dump(json_decode((string) $response->getBody(), true));
    exit;
    
[/code]

[追記]  
・APIからechoで送信されるデータ1回目

[code]

    [
    {data:[~~]},
    
[/code]

・２回目

[code]

    {data:[~~]},
    
[/code]

・３回目

[code]

    {code:200,message:~~}
    ]
    
[/code]

・１回目から３回目を合わせるとjsonデータになります。

[code]

    [
    {data:[~~]},
    {data:[~~]},
    {code:200,message:~~}
    ]
    
[/code]


CC BY-SA 4.0
2022-12-07T02:16:54.740
92612
2022-12-07T06:57:05.810
2022-12-07T05:15:59.077
54583
54583
question
php laravel
API内のループで、echoを使用して出力されたデータを、php内で受け取る方法


「データを分割する」という考え方の方向性自体は悪くありませんが、分割するのであれば2回目以降のやり取りでは「どの部分からのデータをやり取りするのか」の情報が必要になってくるかと思います。

例として、全部で 1,000 件のデータがあるところ 50 件ずつ分割して API がデータを返すとします。

  * 1回目: "オフセット0" として 1 件目 ～ 50 件目を返す
  * 2回目: "オフセット1" として 51件目 ～ 100 件目を返す

また、分割の単位も機械的に行数で分割するのではなく、できれば JSON としてのデータを保ったままレコードごとに分割する方が望ましいように思います。

この辺りは "api pagination" 等で web 検索してもらうと参考になる情報が出てくると思います。


CC BY-SA 4.0
2022-12-07T06:17:03.123
92619
2022-12-07T06:17:03.123
3060
92612
answer


APIの方はストリーミングでレスポンスを返しているような状況ですね。

なので、受け取り側もストリーミングでレスポンスを受け取りパースする必要があります。

英語版に同じような意図の質問がありました。

[PHP HTTP Guzzle client - How to parse a JSON Array using Guzzle Streams -
Stack Overflow](https://stackoverflow.com/questions/65666113/php-http-guzzle-
client-how-to-parse-a-json-array-using-guzzle-streams)

ここに紹介されているJsonCollectionParserを使い、ストリーミングソースとして、`$response->getBody()`
を与え、パーサー関数で適切に処理すればどうでしょうか。

[code]

    $parser->parse($response->getBody(), function (array $item) {
        var_dump($item);
    });
    
[/code]


CC BY-SA 4.0
2022-12-07T06:57:05.810
92620
2022-12-07T06:57:05.810
2668
92612
answer