【问题标题】:Sending HTTP request using Guzzle使用 Guzzle 发送 HTTP 请求
【发布时间】:2018-02-07 09:47:47
【问题描述】:

我正在尝试使用 Guzzle 6 http 客户端发送发布请求。我正在发送两个请求,一个内容类型为application/x-www-form-urlencoded(Guzzle 中的form_params),另一个为application/json(Guzzle 中的json)。

我初始化客户端如下(分别为forms_paramsjson):

$data1 = array("c1" => "a", "c2" => null)
$client = new Client();
$response = $client->post(
  "http://localhost/callback",
  array(
    "form_params" => $data1,          // send as x-www-form-urlencoded
  )
);


$data2 = array("c1" => "a", "c2" => null)
$client = new Client();
$response = $client->post(
  "http://localhost/callback",
  array(
    "json" => $data2,                 // send as json
  )
);

我收到的响应没有相同的数据/正文:

form_params 的输出:Data -> {"c1":"a"}

json 的输出:Data -> {"c1":"a","c2":null}

我不明白为什么它不为上述请求发送相同的数据。这可能是 Guzzle 中的错误吗?有没有办法解决这个问题(除了在发送请求之前删除空值)?

UPDATE:作为请求的端点代码(两个请求都使用相同的代码读取)

if ($$_SERVER["CONTENT_TYPE"] == "application/json") {
    $jsonstr = file_get_contents("php://input");
    $formData = json_decode($jsonstr, true);
} else {
    $formData = $_POST;
}
echo "Data -> " . json_encode($formData);

更新 2:我浏览了 cmets 中提供的关于 Guzzle 中预期行为的链接。

但为什么我首先问这个问题是因为我遇到了签名不匹配的问题。

当我发送请求时,我添加了一个带有签名的标头,该签名不过是hash_hmac("sha256", json_encode($data), "secret_key")。因此,当以jsonform_params 发送数据时,我得到不同的签名(因为在form_params 的情况下接收到的数据不同,因为空值被丢弃/不发送)。首先,我认为这可能是因为 Guzzle 中的一个错误,但事实并非如此。

有没有办法解决这个签名问题?

【问题讨论】:

  • 如果您的端点返回不同的数据,为什么它会成为 Guzzle 中的错误?显示您的端点代码,以便我们更好地了解正在发生的事情。
  • @JonStirling 使用端点代码更新问题
  • 啊哈,严格来说这不是一个错误。 Guzzle 似乎使用了http_build_query,它似乎过滤掉了空值的东西。 IE。在第一个请求中,实际上并没有发送 c2。
  • 这里涉及到:github.com/guzzle/guzzle/issues/973,尤其是这里:github.com/guzzle/guzzle/issues/1181 不是错误,请注意最后一条评论。
  • @JonStirling 你确定是这样吗,我只在调用该函数的 Guzzle 代码(类 - UriTemplate - 方法 expandMatch)中发现了一个事件。我在那里放了一个断点,但没有到达。不确定我是否遗漏了什么。

标签: php json guzzle guzzle6


【解决方案1】:

正如 Jon Stirling 和 Lawrence Cherone 已经注意到的那样,it's not a bug according to Guzzle's authors

因此,您的解决方案是将值转换为form_params 的字符串。这是有道理的,因为 URL 编码格式(与 JSON 不同)没有类型(都是字符串)。你们每个人都定义了自己的转换规则。在 PHP 中(使用 http_build_query)它是这样工作的,完全跳过 nulls。

【讨论】:

  • 请看我的更新 2
猜你喜欢
  • 2020-07-14
  • 2017-08-28
  • 2015-04-14
  • 2019-12-12
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多