PHP POST的JSON编码数组数据

问题描述 投票:0回答:1

我正在尝试将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?

php json api post encode
1个回答
2
投票

原始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属性也是如此。编辑了代码,并在其中插入了一个附加级别。


0
投票

原始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时它将保留在数组中;内部数组具有关联键,因此它自动成为对象。)

© www.soinside.com 2019 - 2024. All rights reserved.