使用 Guzzle 发布表单数据总是返回 404

Posted

技术标签:

【中文标题】使用 Guzzle 发布表单数据总是返回 404【英文标题】:Posting Form data with Guzzle always returns 404 【发布时间】:2020-03-19 11:13:33 【问题描述】:

我很难使用 Guzzle 发送简单的多部分表单请求。 出于某种原因,我总是收到 404 响应,但我使用 cURL 发出相同的请求,我得到 200 ok 并且数据已发布。

即使解决了类似的问题,我似乎也无法弄清楚问题所在。

这是我的 cURL 代码:

$body = shell_exec('curl -H \'Content-Type: multipart/form-data\' -H \'Accept: application/json\' \
-F "photo=@ "'.$photo.'" \
-F "api_key="'.$apiKey.'" \
-F "id=14784" \
"'.$apiUrl.'" 2>&1 > /dev/null 2>&1 &');

shell 在命令行中运行良好,但我需要将其转换为从控制器发出请求,因此我已将表单字段添加到 Guzzle,但没有得到 404。

这是 Guzzle 代码:

 $guzzle = $client->request('POST', config('services.url'), [
                'multipart' => [
                    ['headers' => [
                            'Content-Type: multipart/form-data',
                            'Accept: application/json'
                        ],
                        'name'     => 'api_key',
                        'contents' => config('services.key'),
                    ],
                    [
                        'name'     => 'photo',
                        'contents' => $photo
                    ],
                    [
                        'name'     => 'id',
                        'contents' => "4084",
                    ],
                ]
            ]);

为了发帖,我已经更改了网址,但我正在努力寻找原因,所以如果有人知道,请告诉我!

** 编辑 ** 我已经能够通过 404 但没有收到 500 错误,不确定是表单还是收件人服务器,因为我可以使用 Postman 成功向同一端点发出 POST 请求。

还是一头雾水。

【问题讨论】:

'name' => 'photo=@', ??? 是的,我需要将其添加为参数,请参阅原始 cURL 请求 还有Content-Type: multipart/form-data在curl代码中,application/x-www-form-urlencoded在Guzzle代码中? 在尝试复制之前,您应该了解工作代码在做什么。比如@的意义是什么。 这能回答你的问题吗? Upload file using Guzzle 6 to API endpoint 【参考方案1】:

有两个错误 首先你设置了 base_uri 然后你再次调用它

第二次错误

正如你提到的,你将使用多部分

你应该使用multipart 而不是form_params 并且您不需要请求部分的 json 选项

标题改为Content-Type' => multipart/form-data

因此请求应该是这样的

$response = $client->post('/', [
    'multipart' => $params,
]);

multipart的参考可以在这里看到

【讨论】:

【参考方案2】:

当您设置 base_uri 时,您不必在帖子中添加它。很可能你会调用和 url 类似的http://httpbin.com/http://httpbin.com,.

$response = $client->post('/', ['json' => [
    'form_params' => [
        ....
    ],
]]);

【讨论】:

以上是关于使用 Guzzle 发布表单数据总是返回 404的主要内容,如果未能解决你的问题,请参考以下文章