PHP POST'ing JSON данные в кодированном массиве - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь POST JSON закодировать данные в конечную точку webhook, которая находится на одном из каналов нашей компании Microsoft Teams. Он принимает базовые c JSON кодированные полезные нагрузки.

Я запустил PostMan на своем локальном компьютере и отправил следующее сообщение на URL-адрес веб-подключения коннектора канала Teams:

{
 "@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 может отправлять карты в канал команд. , просто без кнопки действия под ним. Итак, моя проблема заключается в том, как я кодирую дополнительные массивы внутри $ postdata?

Если честно, мои знания о массивах в PHP ограничены, я думаю, что я делаю это правильно, но, очевидно, у меня проблемы, смеется. Есть ли другой / лучший / более правильный способ кодировать несколько массивов внутри массива в JSON данные в POST?

1 Ответ

2 голосов
/ 21 февраля 2020

potentialAction в вашем исходном JSON - это массив объектов, но вы сделали его одноуровневым массивом только в вашей 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. (Внешний массив имеет индекс на основе нуля c, поэтому он остается массивом при преобразовании в JSON; внутренний массив имеет ассоциативные ключи, поэтому он автоматически становится объектом.)


Редактировать : Как отмечено в комментариях, то же самое для свойства targets внутри. Отредактировал код, чтобы вставить туда дополнительный уровень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...