CakePHP 5 получает данные тела POST-запроса

Я создаю REST API, используя CakePHP 5. У меня есть функция POST, которая должна получать данные от почтальона и вводить их в базу данных. Проблема в том, что я не получаю данные в запросе. Запрос GET работает хорошо, так что это определенно не проблема с базой данных. Полученные данные отображаются в виде пустого массива [] с кодом ответа 200. Спасибо за ваше время.

маршруты.php

$routes->scope('/api', function (RouteBuilder $builder): void {
    $builder->connect('/product/insert', ['controller' => 'Product', 'action' => 'insertProduct'])->setMethods(['POST']);
});

Продуктконтроллер.php

public function insertProduct() 
{
    $product = $this -> Product -> newEmptyEntity();
    $product = $this -> Product -> patchEntity($product, $this -> request -> getData());
    $this -> Product -> save($product);
}

Другие вещи, которые я пробовал из документации фреймворка:

$product_name = $this -> request -> getData('product_name');
$product = $this -> Product -> newEntity([
        'name' => $product_name,
]);

$content = json_encode(['method' => __METHOD__, 'class' => get_called_class()]);
$data = $this->request->getParsedBody();
$product = $this -> Product -> newEntity($this->request->getData());
debug($this->request);

У меня также есть классы Table и Entity:

Продукттаблица.php

namespace App\Model\Table;

use Cake\ORM\Table;

class ProductTable extends Table
{
      public function initialize(array $config): void
      {
           $this -> setTable('product');
           parent::initialize($config);
      }
}

Продукт.php

namespace App\Model\Entity;

use Cake\ORM\Entity;

class Product extends Entity
{

}

Фрагмент почтальона

Вам необходимо отправить запрос с заголовком: Content-Type: application/x-www-form-urlencoded. В Postman измените выбор радио с «form-data» на «x-www-form-url-encoded» и отладьте запрос: debug($this->request->getData());

wappy 16.04.2024 23:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
117
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Измените выбор радио с «form-data» на «x-www-form-url-encoded» в Postman, и у вас должны быть данные в $_POST:

public function insertProduct()
{
    $this->request->allowMethod(['post']);

    $associations = [];
    $product = $this->Product->newEmptyEntity();
    // $this->Authorization->authorize($product); // Optional, if you use Authorization

    $data = $this->Product->sanitizeData($this->request->getData(), 'add', $this->authAdmin);
    $product = $this->Product->patchEntity($product, $data, ['associated' => $associations]);

    if ($this->Product->save($product)) {
        $this->set([
            'status' => 200,
            'message' => __('The product has been saved.'),
            'data' => $product,
        ]);
        $this->viewBuilder()->setOption('serialize', ['status', 'message', 'data']);
        return null;
    }

    $this->set([
        'status' => 400,
        'message' => __('The product could not be saved. Please try again.'),
        'errors' => $product->getErrors(),
    ]);
    $this->viewBuilder()->setOption('serialize', ['status', 'message', 'errors']);
    $this->setResponse($this->response->withStatus(400));
    return null;
}
Ответ принят как подходящий

Ответ пользователя wappy - правильный ответ

Вам необходимо отправить запрос с заголовком: Content-Type: application/x-www-form-urlencoded. В Postman измените выбор радио с «form-data» на «x-www-form-url-encoded» и отладьте запрос: debug($this->request->getData());

Другие вопросы по теме