Вернуть исходный тип данных (Коллекция) из другого приложения с помощью GuzzleClient в Laravel - PullRequest
0 голосов
/ 07 августа 2020

У меня проблема при получении возвращенных данных из другого приложения с помощью GuzzleClient. Например, в Первом приложении я вызываю функцию test Второго приложения, чтобы получить возвращаемые данные как Коллективный тип данных, однако я не знаю, как это сделать. Я пытаюсь json_decode ответ в функции call_another_server, но он станет массивом, если я не использую json_decode, он просто вернется в виде строки.

Первое приложение

public function call_another_server()
{
  $client = new GuzzleClient();
  $url = 'http://127.0.0.1:1111/testing'; ##### This url will call to second application@test() function
  $response  = $client->request('GET', $url);

  $data = json_decode($response->getBody()->getContents(), true);//retrieve the response data and decode it as array
  dd($response);
}

Второе приложение

public function test()
{
    $array = ["1" => "one", "2" => "two"];
    return (collect($array)); ##### return as collective
}

Возвращаемый результат (in call_another_server, dd ($ response))

enter image description here


Expected Result ( returned as Collection )

введите описание изображения здесь

Может ли кто-нибудь подсказать мне, как вернуть ожидаемый результат в функции call_another_server? Я знаю, что могу управлять ответом в call_another_server с помощью помощника collect, чтобы сделать ответ типом Collection. Но я надеюсь, что смогу просто получить исходный тип данных из функции test. Любые рекомендации и предложения приветствуются. Спасибо!

1 Ответ

1 голос
/ 07 августа 2020

Вы не можете получить нужную Коллекцию таким образом. Потому что, когда вы return (collect($array)) ваше приложение преобразует вашу коллекцию в массив, а затем преобразует ее в json (для ответа json).

Чтобы избежать преобразования в массив, вы можете сериализовать свою коллекцию , а затем отправьте сериализованные данные (теперь они являются строкой) в качестве ответа.

Итак:

1. Первое приложение

public function call_another_server()
{
  [...]

  $data = unserialize($response->getBody()->getContents());//unserialize retrieved data
  dd($data);
}

2. Второе приложение

public function test()
{
    [...]
    return serialize(__YOUR_COLLECTION_HERE__); // return serialized collection
}

НО ПРЕДУПРЕЖДЕНИЕ:

... Не передавайте ненадежный пользовательский ввод в unserialize () ...

  • Второе: чтобы правильно десериализовать полученные данные, вы должны два приложения имеют один и тот же класс Collection (например, Illuminate\Support\Collection). Также действительно для любого класса объектов, содержащихся в данных коллекции.
...