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
{

}

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

🤔 А знаете ли вы, что...
PHP был создан в 1994 году Расмусом Лердорфом и первоначально назывался 'Personal Home Page'.


117
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());