Строить строку запроса программно в Guzzle?

В моем клиентском коде PHP Guzzle у меня есть что-то вроде

$c = new Client('http://test.com/api/1.0/function');

$request = $c->get('?f=4&l=2&p=3&u=5');

но вместо этого я хочу иметь что-то вроде:

$request->set('f', 4);
$request->set('l', 2);
$request->set('p', 3);
$request->set('u', 5);

Возможно ли это в Guzzle? Из документации и случайного гугления кажется, что да, но я не могу найти, как именно.


person Prof. Falken    schedule 05.09.2012    source источник


Ответы (3)


Guzzle 6 - вы можете использовать параметр параметра запроса

// Send a GET request to /get?foo=bar
$client->request('GET', '/get', ['query' => ['foo' => 'bar']]);

http://docs.guzzlephp.org/en/stable/request-options.html#query

person Vladimir Pak    schedule 12.08.2018
comment
Согласно этим документам, это перезаписывает любую существующую строку запроса. Нельзя подать в суд на редактирование строки. - person Derek; 29.05.2020

Вы можете:

$c = new Client('http://test.com/api/1.0/function');

$request = $c->get();

$q = $request->getQuery();

$q->set('f', 4);
$q->set('l', 2);
$q->set('p', 3);
$q->set('u', 5);
person Prof. Falken    schedule 05.09.2012

Взгляните на документацию 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';
    const HOST = 'http://test.com/';
    const ENDPOINT = 'api/1.0/function';
    const TIMEOUT = 2.0;

    private function getData()
    {

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

        $response = $client->request('GET', self::ENDPOINT,
            [
                RequestOptions::HEADERS => [
                    'Accept' => self::DEFAULT_ACCEPT_HEADER,
                    'Cache-Control' => self::DEFAULT_CACHE_HEADER,
                ],
                RequestOptions::QUERY => [
                        'f' => 4,
                        'l' => 2,
                        'p' => 3,
                        'u' => 5
                ]
            ]
        );

        return json_decode($response->getBody(), JSON_OBJECT_AS_ARRAY);
    }
person bashconsole    schedule 26.11.2020
comment
Я просмотрел документацию, потому что меня смутил ваш ответ. Я не хочу создавать подклассы и никогда ничего не упоминал о JSON. - person Prof. Falken; 26.11.2020
comment
Вам не нужно. Просто используйте то, что считаете полезным. Я считаю, что есть много людей, которые находят этот код полезным для работы с Guzzle. Например, у меня нет возможности реагировать на ответы на stackoverflow, но я часто нахожу что-то полезное. - person bashconsole; 26.11.2020