Почему клиент GuzzleHttp выдает ClientException при использовании его для выполнения сетевого запроса на Laravel/Lumen?

В настоящее время я создаю приложение финансового микросервиса с использованием микрофреймворка Laravel/Lumen. Все работает отлично, как и ожидалось. Моя проблема сейчас в том, что я пытаюсь сделать сетевой запрос к своим внутренним службам через вызов API от ApiGateway с помощью GuzzleHttp клиента. Проблема в том, что когда я делаю запрос к внутренней службе, она всегда выдает исключение Клиентское исключение.

ClientException.

Client error: GET http://127.0.0.1:8081/v1/admin resulted in a 401 Unauthorized response: {"error":"Unauthorized.","code":401}

Я пытался сделать сетевой запрос к тем же внутренним службам, используя почтальон; и это работает нормально. Однако по какой-то причине с GuzzleHttp все равно не работает. Я не знаю, что я делаю неправильно. Пожалуйста, ваша помощь будет оценена по достоинству.

Вот httpClient.php в ApiGateway.

//Constructor method
public function __construct() {
    $this->baseUri = config('services.auth_admin.base_uri');
}

public function httpRequest($method, $requestUrl, $formParams = [], $headers = []) {
    //Instantiate the GazzleHttp Client
    $client = new Client([
        'base_uri' => $this->baseUri,
    ]);
    //Send the request
    $response = $client->request($method, $requestUrl, ['form_params' => $formParams, 'headers' => $headers]);
    //Return a response
    return $response->getBody();
}

//Internal Service Communication in ApiGateway** 
public function getAdmin($header) {
    return $this->httpRequest('GET', 'admin', $header);
}

ВнутреннийServiceController.php

   public function getAdmin(Request $request) {
        return $this->successResponse($this->authAdminService->getAdmin($request->header()));
    }

I am using Lumen version: 5.8 and GuzzleHttp Version: 6.3

Ошибка 401 означает, что вы не аутентифицированы, похоже, вам нужно отправить токен API с запросом.

Jeemusu 30.05.2019 04:43

Вот почему я сбит с толку; заголовок запроса содержит действительный токен, когда я dd($request->header()) и внутренний клиент ожидает, что токен будет в заголовке запроса.

Emeka Augustine 30.05.2019 05:38

Можете ли вы включить этот массив заголовков, который передается в метод?

Jeemusu 30.05.2019 06:11

Можете ли вы изменить $client->request($method, $requestUrl, ['form_params' => $formParams, 'headers' => $headers]) на $client->request($method, $requestUrl, ['query' => $formParams, 'headers' => $headers]) при использовании метода GET?

user9032546 30.05.2019 09:07

Требуются ли для API данные в формате json? если да, вы передаете application/json как тип контента? Если да, то использование form_params вам не поможет. Вместо этого вы должны использовать json. Помимо этого, является ли аутентификация базовой? если да, то ваш заголовок должен быть в таком формате, $header['Authorization'] = "Basic ".base64_encode('your_api_key:your_api_secret_here');

anabeto93 03.06.2019 12:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
382
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы передаете свои заголовки как formParams (третий индекс вместо четвертого).

Попробуйте ниже:

return $this->httpRequest('GET', 'admin', [], $header);

Да, я точно понимаю; Я пробовал это, но все еще не работал.

Emeka Augustine 30.05.2019 13:41

Не могли бы вы обновить свой образец, чтобы мы могли видеть, что вы понимаете? - трудно помочь на основе примера кода с ошибкой

Lasse 30.05.2019 13:44

Спасибо за Ваш ответ; тогда это было очень полезно; Я только что вернулся, чтобы принять ваш ответ.

Emeka Augustine 31.08.2019 02:49

Здесь я делаю некоторые предположения, которые, надеюсь, будут вам полезны.

PHP не поддерживает пропуск необязательных параметров, поэтому при вызове httpRequest() следует передавать пустой массив [].

public function httpRequest($method, $requestUrl, $formParams = [], $headers = [], $type='json', $verify = false) {
    //Instantiate the GazzleHttp Client
    $client = new Client([
        'base_uri' => $this->baseUri,
    ]);

    //the request payload to be sent
    $payload = [];

    if (!$verify) {
       $payload['verify'] = $verify; //basically for SSL and TLS
    }

    //add the body to the specified payload type
    $payload[$type] = $formParams;

    //check if any headers have been passed and add it as well
    if (count($headers) > 0) {
        $payload['headers'] = $headers;
    }

    //Send the request
    $response = $client->request($method, $requestUrl, $payload);
    //Return a response
    return $response->getBody();
}

Теперь вам нужно вызвать его таким образом, когда вы не передаете какие-либо form_params или body

//Internal Service Communication in ApiGateway** 
 public function getAdmin($header) {
     return $this->httpRequest('GET', 'admin', [], $header);
 }

Другие вопросы по теме