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

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

ClientException .

Ошибка клиента: GET http://127.0.0.1:8081/v1/admin: 401 Unauthorized ответ: {"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);
}

InternalServiceController.php

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

Я использую версию Lumen: 5.8 и версию GuzzleHttp: 6.3

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

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

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);
 }
0 голосов
/ 30 мая 2019

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

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

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