将查询字符串参数添加到 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 请求?的主要内容,如果未能解决你的问题,请参考以下文章