【发布时间】:2018-02-07 09:47:47
【问题描述】:
我正在尝试使用 Guzzle 6 http 客户端发送发布请求。我正在发送两个请求,一个内容类型为application/x-www-form-urlencoded(Guzzle 中的form_params),另一个为application/json(Guzzle 中的json)。
我初始化客户端如下(分别为forms_params和json):
$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")。因此,当以json 和form_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)中发现了一个事件。我在那里放了一个断点,但没有到达。不确定我是否遗漏了什么。