使用 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的主要内容,如果未能解决你的问题,请参考以下文章

axios 为带有表单数据的发布请求返回 404

PHP 使用 Guzzle 执行 HTTP 请求

PHP 使用 Guzzle 执行 HTTP 请求

使用 Guzzle 将数据和文件一起发布到 Laravel API

Slim 框架总是返回 404 错误

Resteasy 应用程序总是返回 404