Добавление параметров строки запроса в запрос Guzzle GET?

Я прочитал этот ответ, но я считаю, что есть лучший способ создать http URL-адрес в Guzzle, я ищу что-то подобное, но не могу заставить его работать правильно, и я не знаю, есть ли способ сбросить строку URL-адреса, чтобы увидеть, правильно ли она обрабатывается. Может ли кто-нибудь показать мне правильный способ сделать это?

// works correctly
$client = New GuzzleHttp\Client();
$request = $client->get('http://192.168.50.8/foo?-db=database&-lay=layout&-find');
print_r($request->getBody());

Не работает

$request = $client->get($config->Layout['server'], [], [
        'query' => [
            $config->Layout['switches'], // ([ '-db' => 'database', '-lay' => 'layout', '-find' => true)
            $config->Layout['options'], // other params
        ]
]);

person ehime    schedule 29.04.2014    source источник
comment
пожалуйста, укажите версию жрать. Если да, то мы можем дать конкретные ответы.   -  person Mohammed Safeer    schedule 19.09.2015
comment
Что вы подразумеваете под не работает? Что возвращается для каких входных данных и что вы ожидаете получить?   -  person Nico Haase    schedule 03.08.2020
comment
Связанный stackoverflow.com/questions/13929075/   -  person Prof. Falken    schedule 26.11.2020


Ответы (4)


У меня точно такая же проблема. я нашел решение

public static function getGroupList($current=false) {
$response = self::getRestClient()->get(
    [
        'domains/{domainId}/pricelists',
        ['domainId' => self::getDomainId()]
    ],
    [
        'query' => [
        current => $current
        ]
    ]
);

return new RestResponse($response);

Пытаться

$response = $client->get(
        [
            $config->Layout['server'],
            []
        ],
        [
            'query' => [
                $config->Layout['switches'], // ([ '-db' => 'database', '-lay' => 'layout', '-find' => true)
                $config->Layout['options'], // other params
            ]
        ]
);
person user4550315    schedule 10.02.2015
comment
С guzzle 6 вы можете сделать $client->get('http://example.com', ['query' => ['param1' => 'value1']]); - person hansn; 10.07.2017

Другой вариант правильного ответа:

$params = [
   'query' => [
      'option_1' => string,
      'option_2' => string
   ]
];

А затем вызовите свой запрос:

$response = $guzzle_client->request('GET','/api.com',$params);
person kaleazy    schedule 05.04.2019

В этом примере используются те же переменные, что и в исходном вопросе. Единственный env(TIMEOUT) — это переменная, описанная в каком-то файле .env и может быть заменена константой. Вот как это должно работать. Если это не работает в вашем случае, возможно, проблема в чем-то другом.

        $client = new Client([
                'base_uri' => $config->Layout['server'],
                'timeout' => env("TIMEOUT")
            ]
        );  

        $response = $client->request('GET', $config->Layout['url'],
            [
                RequestOptions::QUERY => array_merge(
                   $config->Layout['switches'],
                   $config->Layout['options']
                ) 
            ]
        );
person bashconsole    schedule 03.08.2020
comment
Пожалуйста, добавьте некоторое объяснение к вашему ответу, чтобы другие могли извлечь из него уроки. - person Nico Haase; 03.08.2020
comment
Привет, Нико, пожалуйста, посмотрите мой предыдущий пример. Я думаю, это должно помочь вам лучше понять код. - person bashconsole; 26.11.2020
comment
Даже в предыдущем ответе есть комментарий ниже с просьбой объяснить. Кроме того, есть ли причина, по которой вы опубликовали два ответа на этот вопрос? - person Nico Haase; 26.11.2020
comment
Я удалил первый ответ, потому что кто-то поставил ему -1 балл и сделал ответ более простым. Наверное, мне не следует этого делать. - person bashconsole; 26.11.2020
comment
Еще раз привет, Нико. Я добавил подробное описание. Дайте мне знать, если у вас есть еще комментарии. Я профессиональный инженер-программист и всегда рад помочь. Но не в том случае, если я получу -1 балл за время, которое я вкладываю. Я только что вернулся, потому что заметил 3 бронзовых значка... - person bashconsole; 26.11.2020
comment
Крайне необычно добавлять два ответа. - person Prof. Falken; 26.11.2020
comment
Этот ответ, который мы комментируем, не редактировался с 3 августа. Можете ли вы также добавить сюда какое-то объяснение, чтобы другие пользователи могли понять, почему вы опубликовали два ответа? - person Nico Haase; 26.11.2020
comment
Добавлено описание для второго ответа. Я считаю, что оба ответа необходимы в этом случае. - person bashconsole; 26.11.2020

Есть лучший способ создать HTTP-запрос URL-адреса в Guzzle. Этот пример следует лучшим практикам в соответствии с архитектурой и документацией Guzzle. Взгляните на документацию Guzzle на https://docs.guzzlephp.org/en/stable/request-options.html Как вы можете видеть, у него есть RequestOptions. RequestOptions являются константами. Они определены в GuzzleHttp\RequestOptions. Вы можете посмотреть исходный код класса и увидеть их все прямо там. Таким образом, чтобы сохранить хороший и профессиональный стиль программирования, вы можете написать следующий исходный код ниже, например

use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;

class DataClass extends BaseClass
{
    const DEFAULT_ACCEPT_HEADER = 'application/json';
    const DEFAULT_CACHE_HEADER = 'no-cache';

    private function getData(array $ids)
    {

        $client = new Client([
                'base_uri' => env("HTTP_HOST"),
                'timeout' => env("TIMEOUT")
            ]
        );

        $response = $client->request('GET', env('ENDPOINT'),
            [
                RequestOptions::HEADERS => [
                    'Accept' => self::DEFAULT_ACCEPT_HEADER,
                    'Cache-Control' => self::DEFAULT_CACHE_HEADER,
                ],
                RequestOptions::QUERY => [
                    'ids' => implode(',', $ids),
                    'stats' => 1
                ]
            ]
        );

        return json_decode($response->getBody(), JSON_OBJECT_AS_ARRAY);
    }
person bashconsole    schedule 31.07.2020
comment
Пожалуйста, добавьте более подробную информацию о том, как это решение работает и помогает решить проблему. См. stackoverflow.com/help/how-to-answer. - person Suit Boy Apps; 31.07.2020
comment
добавлено подробное описание - person bashconsole; 26.11.2020