我尝试使用 Guzzle 将 AJAX API 请求脚本转换为 php,但是我不断收到"400 错误请求"错误。Ajax版本工作正常。但我正在尝试在后端自动化该过程。该脚本通过"POST"请求将文件发送到远程 API,旨在返回一个 JSON 对象,然后将其保存到文件中。
我发现(谷歌搜索)的大多数可能的解决方案都涉及执行一些异常处理或直接停用 guzzle 错误。这些都不起作用。我知道凭据都是正确的,因为我使用错误的凭据进行了测试,并且返回了授权错误。
这个 AJAX 代码工作正常,它从 html 表单中获取文件并将其上传到 API 服务器。
$('#btnUploadFile').on('click', function () {
var data = new FormData();
var files = $("#fileUpload").get(0).files;
for (var i = 0; i < files.length; i++) {
data.append("audioFiles", files[i]); }
data.append("scoresTypes", JSON.stringify([46, 47]));
data.append("Flavor", 1);
data.append("AgentUsername", 'person@email.com');
var ajaxRequest = $.ajax({ type: "POST", url: 'https://remoteserver.com/api/',
headers: { 'Authorization': 'Basic ' + btoa('username' + ':' + 'password') },
scoresTypes: "",
contentType: false,
processData: false,
data: data,
success: function (data) { $("#response").html(JSON.stringify(data)); } });
ajaxRequest.done(function (xhr, textStatus) { });
});
});
这是向文件返回错误"400 错误请求"的 PHP 代码
public function sendFile($file_path, $file_name){
$client = new Client();
$url = 'https://remoteserver.com/api/';
$credentials = base64_encode('username:password');
$audio = fopen($file_path, 'r');
$data = [];
$data['audioFiles'] = $audio;
$data['scoresTypes'] = json_encode([46, 47]);
$data['Flavor'] = 1;
$data['AgentUsername'] = 'person@email.com';
$json_file = '/path/'.$file_name.'.json';
try{
$response = $client->request('POST', $url, [
'headers' => [
'Authorization' => 'Basic '.$credentials,
],
'scoresTypes' => '',
'contentType' => 'false',
'processData' => false,
'data'=>$data
]);
$response_s = json_encode($response);
}
catch(RequestException $e) {
$response_s = $e->getResponse()->getBody();
}
Storage::disk('disk_name')->put($json_file, $response_s);
因此,这是 PHP 函数保存到文件中的输出,而不是预期的 JSON 对象。
{"code":14,"message":"There are no values in scoresTypes or JobTypes keys, please insert valid values in one, or both of them.","responseStatusCode":400}
但是正如你所看到的,提供给ajax版本的初始数据似乎与我在php请求中发送的数据相同。
您是否尝试过将内容类型设置为多部分/表单数据,因为您要发送文件,我认为 post 请求的默认标头是应用程序/x-www-form-urlencoded 我不是 guzzle 专家,但从我在这里的例子中看到的,你可以改用这样的东西
http://docs.guzzlephp.org/en/latest/quickstart.html?highlight=file#sending-form-files
<?php
$response = $client->request('POST', 'http://httpbin.org/post', [
'multipart' => [
[
'name' => 'field_name',
'contents' => 'abc'
],
[
'name' => 'file_name',
'contents' => fopen('/path/to/file', 'r')
],
[
'name' => 'other_file',
'contents' => 'hello',
'filename' => 'filename.txt',
'headers' => [
'X-Foo' => 'this is an extra header to include'
]
]
]
]);