Я создаю 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
{
}
Фрагмент почтальона
Измените выбор радио с «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());
Вам необходимо отправить запрос с заголовком: Content-Type: application/x-www-form-urlencoded. В Postman измените выбор радио с «form-data» на «x-www-form-url-encoded» и отладьте запрос: debug($this->request->getData());