Я использую клиент 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.