Я пытался преобразовать скрипт запроса AJAX API в php с помощью Guzzle, но получаю сообщение об ошибке «400 Bad Request». Версия Ajax работает отлично. Но я пытаюсь автоматизировать процесс в бэкэнде. Сценарий отправляет файл в удаленный API через запрос POST и предназначен для возврата объекта JSON, который я затем сохраняю в файл.
Большинство возможных решений, которые я нашел (для поиска), включали либо обработку некоторых исключений, либо прямую деактивацию ошибок жрета. Ни один из которых не работал. Я знаю, что все учетные данные верны, потому что я проверил неверные учетные данные, и он вернул ошибку авторизации.
Этот код 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) { });
});
});
Это код PHP, который возвращает ошибку «400 Bad Request» в файл
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.