使用 PHP curl 发送 json 时防止双重编码

Prevent double-encoding when sending json with PHP curl

提问人:rubo77 提问时间:10/26/2023 最后编辑:rubo77 更新时间:10/27/2023 访问量:63

问:

当我通过以下方式发送我的 json 编码数组时

<?php

$data=array("Arzt"=>array("Kundennummer"=>"", 
    "Praxisname"=>"Praxis XY",
    "Vorname"=>"Test",
    "Nachname"=>"Test",
    # ...
));


curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Authorization: Basic MTIzMTIzMS1CbGltdXM6clVja20yaVJxT0V2Y1ZTAb1IQUI='));
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data));
$result = curl_exec($ch);

当 CURL 发送此消息时,它会到达编码如下的服务器(网络服务日志):

{"{\"Arzt\":{\"Kundennummer\":\"\",\"Praxisname\":\"Praxis XY\",\"Vorname\":\"Test\",\"Nachname\": .........

但预期的是:

{"Arzt":{"Kundennummer":"","Praxisname":"Praxis XY","Vorname":"Test","Nachname": ..........

如何防止 PHP curl 中 JSON 字符串的双重编码?

php json curl 转义

评论

3赞 ADyson 10/26/2023
json_encode() 无法创建这样的字符串,因为它不是有效的 JSON(无论双重编码如何)。你一定弄错了。您如何看待/调试此内容?你有没有真正检查过这个PHP脚本中的输出?cURL 当然不会改变它。据猜测,接收 Web 服务在记录它之前可能正在对它执行某些操作。请确保您提供该问题的最小可重现示例json_encode($data)
0赞 rubo77 10/26/2023
正如预期的那样,只是正确输出字符串json_encode($data)
1赞 deceze 10/26/2023
猜测:接收端不理解数据是 JSON,而是将其解释为常规表单编码数据,这意味着它正在寻找值。因此,它为您提供整个 JSON 字符串作为具有空值 ()‽ 的对象中的键a=b{"{…}": ""}
0赞 ADyson 10/26/2023
还行。好吧,正如我们所说,这可能是一个与网络服务到达时如何处理它有关的问题。cURL 不会修改数据。(如果要验证这一点,请使用 Fiddler 或 wireshark 等工具监视传出网络流量,并查看 curl 代码生成的 http 请求。将 curl 置于详细模式也可能对此有用。欺骗可能是在某事上 - 也许 Web 服务未设置为接受 JSON 数据。Web 服务是否也是您自己编写的代码?
0赞 rubo77 10/26/2023
不。我尝试将数据发送到另一家公司

答:

1赞 rubo77 10/27/2023 #1

我打过电话

curl_setopt( $ch, CURLOPT_HTTPHEADER, array(...));

几次并认为,每个标头都被添加,但实际上只有最后一个标头被添加到调用中。

您必须将所有标头添加到一个数组中,并且仅将 curl_setopt 用于CURLOPT_HTTPHEADER一次。

在这种情况下,jon 标头被覆盖,因此接收端不理解数据是 JSON,而是将其解释为常规表单编码数据,这意味着它正在寻找值。因此,它为您提供整个 JSON 字符串作为空值对象中的键a=b({"{…}": ""})

评论

0赞 ADyson 10/27/2023
对不起,没注意到你这样做了。很高兴你修好了它!