我正在尝试使用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 :我浏览了评论中提供的关于Guzzle中预期行为的链接。
但为什么我首先提出这个问题是因为我遇到了签名不匹配的问题。
当我发送请求时,我添加一个带有签名的标题,该标题只是hash_hmac("sha256", json_encode($data), "secret_key")
。因此,在将数据作为json
和form_params
发送时,我会得到不同的签名(因为在form_params
的情况下收到的数据不同,因为空值被丢弃/未被发送)。首先,我认为这可能是因为Guzzle中的一个错误,但事实并非如此。
无论如何都要解决这个签名问题?
答案 0 :(得分:0)
Jon Stirling和Lawrence Cherone已经注意到了it's not a bug according to Guzzle's authors。
因此,您的解决方案是将值转换为form_params
的字符串。这是有道理的,因为URL编码格式(与JSON不同)没有类型(都是字符串)。每个人都定义了自己的转换规则。在PHP中(使用http_build_query
),它的工作方式如此,完全跳过null
。