【问题标题】:Adding Query string params to a Guzzle GET request?将查询字符串参数添加到 Guzzle GET 请求?
【发布时间】: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版本。如果是这样,我们可以给出具体的答案。
  • “不工作”是什么意思?哪个输入数据返回什么,你期望返回什么?

标签: php guzzle


【解决方案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);
        }
    

    【讨论】:

    【解决方案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 个青铜徽章......
    猜你喜欢
    • 2012-04-12
    • 2019-11-29
    • 2023-04-02
    • 1970-01-01
    • 2011-02-11
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多