¿Agregar parámetros de cadena de consulta a una solicitud Guzzle GET?

3 minutos de lectura

avatar de usuario
ehime

Leí esta respuesta pero creo que hay una mejor manera de crear una consulta de url http en Guzzle, estoy buscando algo como esto, pero no puedo hacer que funcione correctamente, ni sé si hay una manera de volcar la url cadena para ver si se está procesando correctamente. ¿Alguien podría mostrarme la forma correcta de hacer esto?

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

No funciona

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

  • por favor, especifique la versión guzzle. Si es así, podemos dar respuestas específicas.

    – Mohamed Safeer

    19 de septiembre de 2015 a las 8:49


  • ¿A qué te refieres con “no funciona”? ¿Qué se devuelve para qué datos de entrada y qué espera que se devuelva?

    –Nico Haase

    3 de agosto de 2020 a las 9:27

  • Enlazado stackoverflow.com/questions/13929075/…

    – Profesor Falken

    26 de noviembre de 2020 a las 12:07

Otra variación de la respuesta correcta:

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

Y luego llame a su solicitud:

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

avatar de usuario
usuario4550315

Tengo el mismo problema. encontré solución

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

return new RestResponse($response);

Probar

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

  • Con guzzle 6 puedes hacer $client->get('http://example.com', ['query' => ['param1' => 'value1']]);

    – hansn

    10 de julio de 2017 a las 18:09

avatar de usuario
bashconsole

Hay una mejor manera de crear una consulta de URL http en Guzzle. Este ejemplo sigue las mejores prácticas según la arquitectura y la documentación de Guzzle. Eche un vistazo a la documentación de Guzzle https://docs.guzzlephp.org/en/stable/request-options.html Como puede ver, tiene RequestOptions. RequestOptions son constantes. Se definen en GuzzleHttp\RequestOptions. Puede mirar el código fuente de la clase y verlos todos allí mismo. Por lo tanto, para mantener un estilo de programación bueno y profesional, puede escribir el siguiente código fuente a continuación, por ejemplo

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);
    }

  • Agregue más detalles sobre cómo funciona esta solución y cómo ayuda a resolver el problema. Consulte stackoverflow.com/help/how-to-answer

    – Marcello B.

    31 de julio de 2020 a las 16:40

  • descripción detallada agregada

    – bashconsole

    26 de noviembre de 2020 a las 11:47

avatar de usuario
bashconsole

Este ejemplo utiliza las mismas variables utilizadas en la pregunta original. El único env(“TIMEOUT”) es una variable descrita en algún archivo .env y se puede reemplazar con una constante. Así es como debería funcionar. Si no funciona en tu caso, probablemente el problema esté en otra parte

        $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']
                ) 
            ]
        );

¿Ha sido útil esta solución?