【发布时间】: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(...) )。 -
你是对的 - 解决了它。非常感谢!