【问题标题】:GuzzleHttp\Client ignores base path in base_urlGuzzleHttp\Client 忽略 base_url 中的基本路径
【发布时间】:2014-10-05 19:00:55
【问题描述】:

我在一组基于 PHPUnit 的 REST API 测试中使用 Guzzle。

我按如下方式创建我的客户端:

use GuzzleHttp\Client;

$client = new Client(['base_url' => ['http://api.localhost/api/{version}', ['version' => '1.0']]]);

这很好用,我可以使用以下代码发出请求:

$request = $client->createRequest('GET', '/auth');
$request->setBody(Stream::factory(json_encode(['test'=>'data'])));
$response = $client->send($request);
$decodedResponse = $response->json();

但是,Guzzle 忽略了基本 URL 的 /api/{version} 部分并将请求发送到此处:

http://api.localhost/auth

但是,我希望它会在这里提出请求:

http://api.localhost/api/1.0/auth

我是否误读了文档,因此我的预期行为是错误的,或者我是否需要启用其他选项才能在发出请求时将/auth url 附加到/api/1.0 基本路径?

【问题讨论】:

标签: php guzzle


【解决方案1】:

您在请求中使用了绝对路径,因此它会覆盖在基本 URL 中设置的路径。 Guzzle 在合并 URL 时遵循 RFC 3986:https://www.rfc-editor.org/rfc/rfc3986#section-5.2

【讨论】:

  • 我知道这很明显。谢谢。 :)
  • 那你做了什么?忘记模板服务并继续您的生活吗?
  • 我不确定这意味着什么。您只需要从 URL 中删除前导“/”,以使它们相对于基本 URL 的路径。
  • 感谢@MichaelDowling。介意在你的答案中加入最后一条评论吗?
  • 我还必须在我的base_uri 中添加一个斜杠 - Guzzle 6
【解决方案2】:

我有一种隐晦的回答,可能会对和我一样容易犯错别字的人有所帮助。

它是base_uri,它是“uri”。不是base_url,如“url”。

设置base_url 的结果类似于 OP 描述的问题 - 请求不会建立在配置的基础上。

【讨论】:

  • 附带说明,在 2014 年发生问题时,它是带有 L 的 base_url。当前版本使用 base_uri。我的问题是我以初始斜线开始呼叫本身,因此我没有像预期的那样接到对api.localhost/api{version}/auth的呼叫,而是接到对api.localhost/auth的呼叫。
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 2015-12-29
  • 2011-08-17
  • 1970-01-01
相关资源
最近更新 更多