【问题标题】:Why is Guzzle POST showing this foreach error?为什么 Guzzle POST 显示此 foreach 错误?
【发布时间】:2018-03-07 22:27:25
【问题描述】:

我正在使用

"guzzlehttp/guzzle": "^6.3"

我正在跑步

$client = new \GuzzleHttp\Client([
            'base_uri' => 'http://myapp.loc',
            'headers' => [
                'Content-Type' => 'application/json',
                'Accept' => 'application/json',
            ]
        ]);

然后

$response = $client->post('/api/books',  [
                'json' => [
                    'bookId'    => '123',
                    'title'     => 'My Random Test Book',
                    'author'    => 'Test Author'
                ]
        ]);

但我明白了

GuzzleHttp\Exception\ClientException :客户端错误:POST http://myapp.loc/api/books 导致 404 Not Found 响应: 为 foreach() 提供的参数无效

如果我在 Postman 中使用相同的路由和数据一切正常,那么路由和方法就可以了。

我也试过了

 $response = $client->post('/api/books', [
        'headers' => [
                'Content-Type' => 'application/json',
                'Accept' => 'application/json',
            ],
        'body' => json_encode([
            'bookId'    => '123',
            'title'     => 'My Random Test Book',
            'author'    => 'Test Author'
        ])
    ]);

但它返回相同的 foreach 错误。

关于 Guzzle 为何显示此 foreach 错误的任何想法?

使用 Xdebug 对此进行深入研究,错误来自 \GuzzleHttp\Psr7\Stream 处的 fread

public function read($length)
{
   ...

    $string = fread($this->stream, $length);

【问题讨论】:

    标签: php json guzzle


    【解决方案1】:

    所以解决方案是形成这样的请求:

    $response = $client->request('POST', 'http://myapp.loc/api/books', [
                'form_params' => [
                   'parameters' => json_encode([[
                        'bookId'    => '123',
                        'title'     => 'My Random Test Book',
                        'author'    => 'Test Author'
                    ]])
                ]
            ]);
    

    【讨论】: