PHP Laravel BaseRepository CURL Ошибка [curl_setopt_array (): предоставленный ресурс не является допустимым ресурсом дескриптора cURL] - PullRequest
0 голосов
/ 12 марта 2019

Я создал небольшое и простое веб-приложение в Laravel, для которого я использую API для извлечения данных и визуализации в удобной для пользователя форме. Для обработки / извлечения данных из API я создал BaseRepository в своем приложении, но я получаю эту ошибку: "curl_setopt_array(): supplied resource is not a valid cURL handle resource"

Вот как это выглядит

Here is how it looks like

Было бы здорово, если бы кто-нибудь мог помочь.

Вот мой код:

<?php

namespace App\Repositories;


// 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_credentials&client_id=MY_ID_GOES_HERE&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 Ответ

1 голос
/ 13 марта 2019

Полагаю, один из ваших дочерних классов репозитория определяет метод __construct(), и вы забываете вызывать parent::__construct() внутри него, поэтому метод curl_init() никогда не вызывается.

Редактировать: Комментарий Фила - еще одна очень вероятная причина вашей проблемы. Вызов curl_close() в одном методе не позволит следующему работать с совместно используемой инициализацией cURL.

Я бы действительно предложил просто перейти curl_init() к каждому методу репозитория. Ваши запросы не связаны и могут иметь разные параметры и конфигурацию. Изменяя один экземпляр cURL, вы можете поделиться опциями, которые вы не собирались. Он также позволяет вам использовать __construct() в каждом из ваших дочерних классов репозитория, не беспокоясь о BaseRepository и его конструкторе (который вы можете удалить).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...