将查询字符串参数添加到 Guzzle GET 请求?

Posted

技术标签:

【中文标题】将查询字符串参数添加到 Guzzle GET 请求?【英文标题】:Adding Query string params to a Guzzle GET request? 【发布时间】:2014-06-15 20:37:38 【问题描述】:

我阅读了this answer,但我相信有更好的方法可以在 Guzzle 中创建 http url 查询,我正在寻找类似的东西,但无法使其正常工作,也不知道是否有办法转储 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
        ]
]);

【问题讨论】:

请指定guzzle版本。如果是这样,我们可以给出具体的答案。 “不工作”是什么意思?哪个输入数据返回什么,你期望返回什么? 链接***.com/questions/13929075/… 【参考方案1】:

正确答案的另一种变体:

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

然后调用你的请求:

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

【讨论】:

【参考方案2】:

我也有同样的问题。我找到了解决方案

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

【讨论】:

使用 guzzle 6 你可以做到$client->get('http://example.com', ['query' => ['param1' => 'value1']]);【参考方案3】:

在 Guzzle 中有一种更好的方法来创建 http url 查询。此示例遵循 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);
    

【讨论】:

请添加有关此解决方案如何工作并帮助解决问题的更多详细信息。请看***.com/help/how-to-answer 添加了详细说明【参考方案4】:

此示例使用原始问题中使用的相同变量。 唯一的 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']
                ) 
            ]
        );

【讨论】:

请在您的答案中添加一些解释,以便其他人可以从中学习 嗨 Nico,请参阅我之前的示例。我认为它应该可以帮助您更好地理解代码。 即使之前的答案在下面也有评论要求解释。此外,您是否有任何理由发布此问题的两个答案? 我已经删除了第一个答案,因为有人给它设置了-1 分数并且使答案更简单。可能我不应该那样做。 你好,尼科。我添加了详细的描述。如果你有更多的 cmets,请告诉我。我是专业的软件工程师,我总是乐于提供帮助。但如果我在我贡献的时间内得到-1分,那就不行了。我刚回来是因为我注意到了 3 个青铜徽章......

以上是关于将查询字符串参数添加到 Guzzle GET 请求?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用 Guzzle 执行 HTTP 请求

PHP 使用 Guzzle 执行 HTTP 请求

phpunit Guzzle 异步请求

在使用get请求时,也可以向请求中传递url参数对吗?

如何向 GET 请求添加标头字段和参数?

如何将 url 参数(查询字符串)传递给 Angular 上的 HTTP 请求?