#php #laravel #api #curl
#php #laravel #API #curl
Вопрос:
Я создал небольшое и простое веб-приложение в Laravel, для которого я использую API для извлечения данных и визуализации удобным для пользователя способом. Для обработки / извлечения данных из API я создал базовое хранилище в своем приложении, но я получаю эту ошибку: "curl_setopt_array(): supplied resource is not a valid cURL handle resource"
Вот как это выглядит
Было бы здорово, если бы кто-нибудь мог помочь.
Вот мой код:
<?php
namespace AppRepositories;
// Class BaseRepository.
class BaseRepository
{
public $curl = null;
public function __construct()
{
$this->curl = curl_init();
}
public function getAccessToken()
{
curl_setopt_array($this->curl, array(
CURLOPT_URL => "https://identity.vwgroup.io/oidc/v1/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "grant_type=client_credentialsamp;client_id=MY_ID_GOES_HEREamp;client_secret=MY_CLIENT_SECRET",
CURLOPT_HTTPHEADER => array(
"Cache-Control: no-cache",
"Content-Type: application/x-www-form-urlencoded",
"Postman-Token: 84e72567-25d5-42ba-8a94-fe88e6bcc41d",
"cache-control: no-cache",
),
));
$response = curl_exec($this->curl);
$err = curl_error($this->curl);
curl_close($this->curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
// Convert JSON string to Object
$responseObject = json_decode($response);
$accessToken = $responseObject->access_token; // Access Object data
return $accessToken;
}
}
public function getCountries()
{
curl_setopt_array($this->curl, array(
CURLOPT_URL => "https://api.productdata.vwgroup.com/v2/countries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"Accept: application/json",
"Authorization: bearer " . $this->getAccessToken(),
"Postman-Token: e6625e0a-fc50-4382-8812-8d151457dcab,67edecb8-64bd-4c93-9892-ec1061d5f210",
"cache-control: no-cache,no-cache",
),
));
$response = curl_exec($this->curl);
$err = curl_error($this->curl);
curl_close($this->curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
// Convert JSON string to Object
$responseObject = json_decode($response, true);
$data = array('data' => $responseObject['data']);
return $data;
}
}
}
Комментарии:
1. Как вы вызываете эти методы? Наличие
curl_close($this->curl)
в конце каждого метода сделает невозможным его использование в другом методе того же экземпляра класса.2. А, теперь я понимаю. Вы вызываете
getAccessToken()
изgetCountries()
. Видите проблему с использованиемcurl_close()
общего дескриптора?3. Затем эти методы вызываются из моего контроллера, который затем передает информацию в мое представление
Ответ №1:
Я предполагаю, что один из ваших дочерних классов репозитория определяет __construct()
метод, и вы забываете вызвать parent::__construct()
внутри него, поэтому curl_init()
метод никогда не вызывается.
Редактировать: Комментарий Фила — еще одна очень возможная причина вашей проблемы. Вызов curl_close()
в одном методе не позволит следующему работать с общим cURL init.
Я бы действительно предложил просто перейти curl_init()
к каждому методу репозитория. Ваши запросы не связаны и могут использовать разные параметры и конфигурацию. Изменяя один экземпляр cURL, вы можете предоставить общий доступ к параметрам, которые вы не планировали. Это также позволяет вам использовать __construct()
в каждом из ваших дочерних классов репозитория, не беспокоясь о BaseRepository и его конструкторе (который вы можете удалить).
Комментарии:
1. Спасибо, это сработало, просто нужно было поместить его в функцию
curl_init()