Ждет поток файлов отправки HTTP-сообщений об ошибках - «ошибка json_encode: тип не поддерживается» - PullRequest
0 голосов
/ 31 августа 2018

Я использую клиент Guzzle в своем приложении Laravel для отправки запроса конечной точке API вместе с файлом. Я достигаю этого, создавая составные данные следующим образом:

$rid = $this->wsl->curlWSl('POST', '/throttle', [], [
            'verify' => false,
            'multipart' => [
                [
                    'name'     => 'csv',
                    'contents' => fopen($dest, 'rb')
                ],
                [
                    'name' => 'name',
                    'contents' => $request->input('name')
                ],
                [
                    'name' => 'description',
                    'contents' => $request->input('description')
                ],
                [
                    'name' => 'header',
                    'contents' => '1'
                ]
            ]
]);

Метод curlWSL, который я определил, как указано ниже -

public function curlWSl(string $method, string $path, Array $headers = [], Array $data = null, Array $options = [])
    {
        $endPoint = $this->getUri() . $path;

        if (!empty($headers)) {
            $options['headers'] = $headers;
        }

        if ($method == 'GET' && $data) {
            $endPoint .= http_build_query($data);
        }
        if ($method == 'POST') {
            $options['json'] = $data;
        }

        try {
            $response = $this->getClient()->request(
                $method,
                $endPoint,
                $options
            );
        } catch (\Exception $ex) {
            return ['statusCode'=>$ex->getCode(), 'errorMsg' => $ex->getMessage()];
        }

        return json_decode($response->getBody()) ?? (string)$response->getBody();
    }

Делая это, я получаю исключение -

InvalidArgumentException {#296 ▼
  #message: "json_encode error: Type is not supported"
  #code: 0
  #file: "/var/www/html/vendor/guzzlehttp/guzzle/src/functions.php"
  #line: 327
  trace: {▶}
}

Я уверен, что это из-за потока файлов fopen, потому что когда я удаляю это, мой запрос получен в конечной точке.

Мне также нужна помощь по проверке данных запроса на конечной точке API с использованием средств проверки уровня laravel .

Ваша помощь очень ценится.

Примечание: я очень хочу передать объект файла, а не только данные файла, что я могу сделать с file_get_contents.

1 Ответ

0 голосов
/ 05 сентября 2018

Я всё исправил.
Guzzle не обрабатывает слишком много параметров для отправки, как в запросе к конечной точке. Поскольку мы настраиваем $options['json'] = $data, и это учитывает данные в формате json, которого на самом деле нет. Итак, мне пришлось превратить его в multipart вместо json, чтобы все заработало. Мне пришлось изменить вызов, как показано ниже -

$rid = $this->wsl->curlWSl('POST', '/throttle', [], [
                [
                    'name'     => 'csv',
                    'contents' => fopen($dest, 'rb')
                ],
                [
                    'name' => 'name',
                    'contents' => $request->input('name')
                ],
                [
                    'name' => 'description',
                    'contents' => $request->input('description')
                ],
                [
                    'name' => 'header',
                    'contents' => '1'
                ]
]);

И в методе curlWSL я изменил код так, чтобы принимать данные как multipart-

public function curlWSl(string $method, string $path, Array $headers = [], Array $data = null, Array $options = [])
    {
        $endPoint = $this->getUri() . $path;

        if (!empty($headers)) {
            $options['headers'] = $headers;
        }

        if ($method == 'GET' && $data) {
            $endPoint .= http_build_query($data);
        }
        if ($method == 'POST') {
            $options['multipart'] = $data;
        }

        try {
            $response = $this->getClient()->request(
                $method,
                $endPoint,
                $options
            );
        } catch (\Exception $ex) {
            return ['statusCode'=>$ex->getCode(), 'errorMsg' => $ex->getMessage()];
        }

        return json_decode($response->getBody()) ?? (string)$response->getBody();
    }
...