【问题标题】:PHP cURL API problem with nested arrays and http_build_query嵌套数组和 http_build_query 的 PHP cURL API 问题
【发布时间】:2021-11-27 10:42:51
【问题描述】:

在终端上使用 cURL 代码更改在线 SIP 服务上的转发电话号码(无权访问 REST API 服务器端):

curl --request PUT --header "Accept: application/json" --header "Authorization: Basic abcdefABCDEFmysecretkey123456" -d '{"forwardings":[{"destination":"+447979123456","timeout":0,"active":true}]}' --header "Content-type: application/json" https://api.sipgate.com/v2/w0/phonelines/p0/forwardings

但是,我在 PHP 中复制此代码的努力导致了 {"error":"cannot parse content"} 响应:

$ch = curl_init();
$churl='https://api.sipgate.com/v2/w0/phonelines/p0/forwardings';
$chdata = array(
    'forwardings' => array(
        'destination' => '+447979123456',
        'timeout' => 0,
        'active' => true
    )
);
$chdata2 = http_build_query($chdata);
curl_setopt($ch, CURLOPT_URL, $churl);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-type: application/json",
    "charset: utf-8",
    "Accept: application/json",
    "Authorization: Basic abcdefABCDEFmysecretkey123456"
));
curl_setopt($ch, CURLOPT_POSTFIELDS, $chdata2);
$json = curl_exec($ch);
echo $json;
curl_close($ch);

我错过了什么?

【问题讨论】:

  • http_build_query 将数据编码为application/x-www-form-urlencoded。但是,您的 CLI cURL 语句中的数据是 JSON,这甚至是您在 Content-Type 标头中所说的。
  • 不,我建议您实际上 发送 JSON,而不仅仅是 的 Content-Type 标头,而实际上您不是真的。
  • 我可能错了,但我认为json_encode 没有正确处理嵌套数组?当我将http_build_array($chdata) 更改为json_encode($chdata)(我实际上首先尝试过)时,服务器响应更改为com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token - 这就是让我转向http_build_query的原因
  • json_encode 可以很好地处理它们,只是您一开始就没有设法提供正确的输入数据结构。您的数据中缺少一个数组级别。 'forwardings' => array(...) 必须是 'forwardings' => array( array(...) )
  • 你是对的 - 解决了它。非常感谢!

标签: php curl put


【解决方案1】:

[来自 cmets} 我可能错了,但我认为 json_encode 不能正确处理嵌套数组?

json_encode 可以很好地处理它们,只是您一开始就没有提供正确的输入数据结构。

您的数据中缺少一个数组级别。 'forwardings' => array(...) 必须是'forwardings' => array( array(...) )


顺便说一句/仅供参考/对于任何可能需要它的人:获取您需要的数据结构的简单方法,已经以可用 PHP 代码的形式,基于现有的 JSON,将是var_export 和 json_decode 的组合:

var_export(json_decode('{"forwardings":[{"destination":"+447979123456","timeout":0,"active":true}]}', 1));

得到以下结果,

array (
  'forwardings' => 
  array (
    0 => 
    array (
      'destination' => '+447979123456',
      'timeout' => 0,
      'active' => true,
    ),
  ),
)

所以你可以在前面打一个$chdata = ,在最后打一个;,然后就完成了。

【讨论】:

    【解决方案2】:

    由于内容类型设置为 JSON,它期望您传递的数据是 json 编码的。

    尝试替换

    $chdata2 = http_build_query($chdata);
    

    $chdata2 = json_encode($chdata);
    

    更新 @CBroe 评论

    将$chdata数组改为

    $chdata = array(
        'forwardings' => array(
            array(
                'destination' => '+447979123456',
                'timeout' => 0,
                'active' => true
            )
        )
    );
    

    【讨论】:

    • 我可能错了,但我认为json_encode 没有正确处理嵌套数组?当我将http_build_array($chdata) 更改为json_encode($chdata)(我实际上首先尝试过)时,服务器响应更改为com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token - 这就是让我转向http_build_query的原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多