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