使用Guzzle发送HTTP请求

时间:2017-08-29 20:06:29

标签: php json guzzle guzzle6

我正在尝试使用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 :我浏览了评论中提供的关于Guzzle中预期行为的链接。

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

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

无论如何都要解决这个签名问题?

1 个答案:

答案 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