使用Guzzle 6向eBay FEED_API端点上传文件返回400错误如何解决
错误原因
你遇到的问题由两个核心配置错误导致:
- 手动设置了
Content-Type: multipart/form-data请求头
使用Guzzle的multipart参数发送表单请求时,Guzzle会自动生成带随机边界(boundary)的Content-Type头,格式为multipart/form-data; boundary=xxx,边界是服务器拆分多个表单字段的依据。你手动设置的头没有边界信息,导致eBay服务器无法正确解析上传的表单和文件,返回400错误。 - Guzzle默认开启SSL证书验证
你的CLI curl使用了-k参数、原生PHP curl代码也关闭了CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST,如果你的运行环境没有配置完整的根证书链,默认开启SSL验证的Guzzle也会触发请求异常。
另外你贴出的Guzzle代码里文件路径没有加引号,属于语法错误,调整时注意补全。
修正后的代码
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.ebay.com']); $client->request('POST', '/sell/feed/v1/task/task-40-XXXXXXXXXX/upload_file', [ // 关闭SSL验证,和你的curl配置对齐 'verify' => false, 'headers' => [ 'Authorization' => 'Bearer ' . $this->getToken($ebayStore), // 移除手动设置的Content-Type头,由Guzzle自动生成 ], 'multipart' => [ [ 'name' => 'fileName', 'contents' => basename('/path/to/file') ], [ 'name' => 'name', 'contents' => 'file' ], [ 'name' => 'type', 'contents' => 'form-data' ], [ 'name' => 'file', 'contents' => fopen('/path/to/file', 'r'), 'filename' => basename('/path/to/file') ] ] ]);
补充说明:你可以根据实际需求移除fileName、name、type三个额外字段,你的CLI curl命令仅传了file字段也能正常上传,说明这三个字段不是eBay接口的必填参数。
内容的提问来源于stack exchange,提问作者krybbio
相关产品推荐
相关产品推荐

