我正在尝试将JSON编码的数据发布到驻留在我们公司Microsoft Teams渠道之一的webhook终结点上。它接受基本的JSON编码的有效负载。
我从本地计算机上的PostMan开始,并将以下内容发布到我的Teams Channel连接器Webhook URL:
{
"@context": "https://schema.org/extensions"
"@type": "MessageCard",
"themeColor": "0072C6",
"title": "Test From PostMan",
"text": "This is the text body of the notification card",
"potentialAction": [
{
"@type": "OpenUri",
"name": "View in Browser...",
"targets": [
{ "os": "default", "uri": "https://<REDACTED>" }
]
}
]
}
这很好,它将卡片张贴在团队频道中,下方是操作按钮。
所以我转到了PHP,然后编写了以下代码:
<?php
//api endpoint
$url = 'https://<REDACTED>';
//new curl connection
$ch = curl_init($url);
//build json data array
$postdata = array(
'@context' => 'https://schema.org/extensions',
'@type' => 'MessageCard',
'themeColor' => '0072C6',
'title' => 'Test from curl in PHP',
'text' => 'test string.. test string.. test string.. test string.. test string.. test string.. test string..',
'potentialAction' => array (
'@type' => 'OpenUri',
'name' => 'View in Browser...',
'targets' => array (
'os' => 'default',
'uri' => 'https://<REDACTED>'
)
)
);
//encode json data array
$encodeddata = json_encode($postdata);
//set curl options
curl_setopt($ch, CURLOPT_POSTFIELDS, $encodeddata);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
//debug
echo $result;
//close
curl_close($ch);
?>
[当我执行上述操作时,API错误,并回应说这是无效的有效负载。因此,我将代码剥离了下来,以便使$postdata
数组更加简单,如下所示:
//build json data array
$postdata = array(
'@context' => 'https://schema.org/extensions',
'@type' => 'MessageCard',
'themeColor' => '0072C6',
'title' => 'Test from curl in PHP',
'text' => 'test string.. test string.. test string.. test string.. test string.. test string.. test string..'
);
而且效果很好,我的PHP脚本能够将卡片发布到Teams频道,而下面没有任何操作按钮。所以我的问题在于我如何编码$ postdata内的其他数组?
老实说,我对PHP数组的了解有限,我认为我做得正确,但是显然我遇到了问题,哈哈。是否有其他/更好/更正确的方法将数组中的多个数组编码为JSON数据以进行POST?
原始JSON中的[potentialAction
是对象数组,但仅在PHP数据结构中将其设置为单级数组。
您需要将其包装到另一个级别:
$postdata = array(
'@context' => 'https://schema.org/extensions',
'@type' => 'MessageCard',
'themeColor' => '0072C6',
'title' => 'Test from curl in PHP',
'text' => 'test string.. test string.. test string.. test string.. test string.. test string.. test string..',
'potentialAction' => array (
array (
'@type' => 'OpenUri',
'name' => 'View in Browser...',
'targets' => array (
array (
'os' => 'default',
'uri' => 'https://<REDACTED>'
)
)
)
)
);
当您将其编码为JSON时,它将在该位置提供一系列对象。 (外部数组具有从零开始的数字索引,因此在转换为JSON时它将保留在数组中;内部数组具有关联键,因此它自动成为对象。)
编辑:如注释中所述,内部的targets
属性也是如此。编辑了代码,并在其中插入了一个附加级别。
原始JSON中的[potentialAction
是对象数组,但仅在PHP数据结构中将其设置为单级数组。
您需要将其包装到另一个级别:
$postdata = array(
'@context' => 'https://schema.org/extensions',
'@type' => 'MessageCard',
'themeColor' => '0072C6',
'title' => 'Test from curl in PHP',
'text' => 'test string.. test string.. test string.. test string.. test string.. test string.. test string..',
'potentialAction' => array (
array (
'@type' => 'OpenUri',
'name' => 'View in Browser...',
'targets' => array (
'os' => 'default',
'uri' => 'https://<REDACTED>'
)
)
)
);
当您将其编码为JSON时,它将在该位置提供一系列对象。 (外部数组具有从零开始的数字索引,因此在转换为JSON时它将保留在数组中;内部数组具有关联键,因此它自动成为对象。)