Ошибка Guzzle Вызов функции-члена getStatusCode() для null, когда curl и Postman в порядке

Я настраиваю Guzzle в качестве HTTP-клиента Laravel 6 в своем проекте. Он отлично работал и давал ответы на каждое обращение к API. Но вдруг он возвращает вызов функции-члену getStatusCode() при нулевой ошибке.

Я пытался использовать Postman и curl для обращения к API, и они возвращают правильный ответ, когда Guzzle не работает.

Вместо возврата ответа print_r для ответа RequestException возвращает значение null.

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

Вот мой код Guzzle:

class ApiCallback
{
    public static function request($method, $uri, $params = [], $useAccessToken = true){
        $client = new \GuzzleHttp\Client();
        $response = null;

        $jsonObj = null;
        try{
            if($useAccessToken){
                $response = $client->request(
                    strtoupper($method),
                    $uri,
                    [
                        "headers" =>[
                            'Accept' => '*/*',
                            "Authorization" => "Bearer ".Session::get('access_token'),
                            'Content-Type' => 'application/json',
                            'User-Agent' => 'saranaku-'.Session::get('id'),
                            'Content-Length' => '0',
                            'Accept-Encoding' => 'gzip, deflate, br',
                            'Connection' => 'keep-alive'
                        ]
                        ,
                        "body" => \json_encode(
                            $params
                        )
                    ]
                );
            }else{
                $response = $client->request(
                    strtoupper($method),
                    $uri,
                    [
                        "headers" =>[
                            'Accept' => '*/*',
                            'Content-Type' => 'application/json',
                            'User-Agent' => "saranaku-guest",
                            'Content-Length' => '0',
                            'Accept-Encoding' => 'gzip, deflate, br',
                            'Connection' => 'keep-alive'
                        ]
                        ,
                        "body" => \json_encode(
                            $params
                        )
                    ]
                );
            }
            $jsonObj = json_decode((string) $response->getBody());
            return new BaseResponse(
                $jsonObj->status ?? false,
                $jsonObj->code ?? null,
                $jsonObj->message ?? null ,
                $jsonObj->data ?? null
            );
        }catch(RequestException $e){
//            echo Psr7\str($e->getRequest());
//            echo Psr7\str($e->getResponse());
            $jsonObj = $e->getResponse();
            print_r($e->getResponse());
        }
        return new BaseResponse(
            $jsonObj->status ?? false,
            $jsonObj->getStatusCode() ?? null,
            $jsonObj->getReasonPhrase() ?? null ,
            $jsonObj->data ?? null
        );
    }

    public static function requestWithoutAccessToken($method, $url, $params = []){
        return ApiCallback::request($method, $url, $params, false);
    }
}

final class BaseResponse
{
    public $status;
    public $code;
    public $message;
    public $data;

    public function __construct($status,$code,$message = "",$data = [])
    {
        $this->status = $status;
        $this->code = $code;
        $this->message = $message;
        $this->data = $data;
    }
}

Дополнительная информация:

  1. REST API работает на локальном хосте с конечной точкой: /v1/login.
  2. HTTP-метод — POST.
  3. REST API использует Java Spring Boot v1.5.6.
  4. Тело запроса
{
     "data":{
          "username": "username_string",
          "password": "password_string"
     }
}
  1. Я пробовал очищать кеши и делать composer dump-autoload, но проблема все еще сохраняется.

person Yosua Kristianto    schedule 01.07.2020    source источник


Ответы (1)


Я нашел проблему и решение.

Итак, я делаю некоторую регистрацию исключения с помощью Log и обнаружил, что мой $uri недействителен, поскольку мой URL-адрес API BASE не был найден в файле .env. Так что решение делает php artisan cache:clear и жрет работает.

Всем, кто читает этот вопрос, не забудьте попробовать Log, если трассировка стека вам не помогла.

person Yosua Kristianto    schedule 18.07.2020