Как правильно обработать почтовый запрос PHP? - PullRequest
0 голосов
/ 21 июня 2020

Я делаю небольшой API для обработки некоторых опросов.

У меня следующее тело:

{
  "name":"1: asd",
  
  "children":[
     {
        "name":"2: are",
        "children":[
           {
              "name":"3: wat wat",
              "children":[
                 {
                    "name":"4: in da hut",
                    "context":{
                       "question":"in da hut",
                       "questionType":"rbText",
                       "answers":[
                          {
                             "value":"",
                             "index":0,
                             "indexValue":1
                          }
                       ]
                    }
                 },
                 {
                    "name":"5: k k k k",
                    "context":{
                       "question":"k k k k",
                       "questionType":"rbText",
                       "answers":[
                          {
                             "value":"",
                             "index":0,
                             "indexValue":1
                          }
                       ]
                    }
                 }
              ],
              "context":{
                 "question":"wat wat",
                 "questionType":"rbMultiple",
                 "answers":[
                    {
                       "value":"sim",
                       "index":2,
                       "indexValue":4
                    },
                    {
                       "value":"nao",
                       "index":3,
                       "indexValue":5
                    }
                 ]
              }
           }
        ],
        "context":{
           "question":"are",
           "questionType":"rbMultiple",
           "answers":[
              {
                 "value":"potatoes",
                 "index":4,
                 "indexValue":3
              },
              {
                 "value":"nay",
                 "index":4,
                 "indexValue":3
              }
           ]
        }
     }
  ],
  "context":{
     "question":"asd",
     "questionType":"rbText",
     "answers":[
        {
           "value":"",
           "index":5,
           "indexValue":2
        }
     ]
  }

}

на стороне php , чтобы проверить, поступил ли запрос, я попробовал следующее:

echo $_POST['name'];

Но я получаю следующую ошибку:

Уведомление : Неопределенный индекс: имя в C: \ xampp \ htdocs \ LimeAPI \ api \ objects \ create. php в строке 15

Итак, я добавил

var_dump($_POST)

, который правильно печатает мой запрос внутри массива.

Итак, я изменил свой код для итерации по массиву и распечатайте элемент:

foreach($_POST as $item) {    
    echo $item;
    var_dump($item);
}

Но теперь я получаю следующее:

<b>Notice</b>:  Array to string conversion in <b>C:\xampp\htdocs\LimeAPI\api\objects\create.php</b> on line <b>17</b><br /> Arrayarray(1) {   ["
         {
            "name":"2: are",
            "children":[
               {
                  "name":"3: wat wat",
                  "children":[
                     {
                        "name":"4: in da hut",
                        "context":{
                           "question":"in da hut",
                           "questionType":"rbText",
                           "answers":[
                              {
                                 "value":"",
                                 "index":0,
                                 "indexValue":1
                              }
                           "]=>   string(0) "" }

Что я делаю не так?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 21 июня 2020

From $_POST документация (выделено мной):

Ассоциативный массив переменных, переданных в текущий скрипт через метод HTTP POST при использовании application/x-www-form-urlencoded или multipart/form-data как HTTP Content-Type в запросе.

Любой другой тип MIME (application/json, application/xml ...) просто не декодируется автоматически и требует свой собственный разбор.

1 голос
/ 21 июня 2020

Сначала вам нужно получить доступ ко всему телу запроса:

$post_body = file_get_contents("php://input");

затем, поскольку это возвращает строку, вам нужно декодировать JSON:

$content = json_decode($post_body);

и тогда у вас будет объект, представляющий тело запроса, которое name можно получить с помощью оператора стрелки:

echo $content->name
...