Исправление неправильного запроса Guzzle 400 для ошибки API - PullRequest
0 голосов
/ 11 апреля 2019

Я пытался преобразовать скрипт запроса 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.

1 Ответ

0 голосов
/ 11 апреля 2019

вы пытались установить Content-Type на multipart / form-data, так как вы отправляете файлы, я думаю, что заголовок по умолчанию для пост-запроса - application / x-www-form-urlencoded.то, что я видел на примерах здесь, вы можете использовать что-то вроде этого вместо

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'
            ]
        ]
    ]
]);
...