Получение POST запроса

Аватар пользователя Artalek Artalek 8 октября 2020 в 10:04

Здравствуйте, мне нужен контроллер, который бы принимал POST параметры, и в ответ возвращал JSON данные.

Вот как я сделал, но не работает, не получает POST параметры.

routing.yml:

modulemy.json_api:
  path: '/api/json'
  defaults:
    _controller: 'Drupal\modulemy\Controller\JsonApiController::renderApi'
    _title: 'JSON api'
  requirements:
    _access: 'TRUE'

JsonApiController.php:


<?php

namespace Drupal\modulemy\Controller;

 use 

Drupal\Core\Controller\ControllerBase;
use 
Symfony\Component\HttpFoundation\JsonResponse;
use 
Symfony\Component\HttpFoundation\Request;

/**
 * Implementing our example JSON api.
 */
class JsonApiController extends ControllerBase {
    
/**
    * Callback for the API.
    */
    
public function renderApi(Request $request) {
   
$value = !empty($request->request->get('your_posted_variable')) ? $request->request->get('your_posted_variable') : '2'
        return new 
JsonResponse([
            
'data' => $value,
            
'method' => 'POST',
        ]);
    }
}
?>

Он постоянно мне возвращает '2'.

Лучший ответ

Аватар пользователя OldWarrior OldWarrior 9 октября 2020 в 5:36
1

Попробуйте явно указать/ограничить метод обращения к контроллеру:

modulemy.json_api:
  path: '/api/json'
  defaults:
    _controller: 'Drupal\modulemy\Controller\JsonApiController::renderApi'
    _title: 'JSON api'
  methods:  'POST'
  requirements:
    _access: 'TRUE'

https://www.drupal.org/docs/drupal-apis/routing-system/structure-of-routes

UPD. Вообще - неплохо бы привести ещё и исходный HTML-код формы. Судя по всему, Drupal Form API не используется.

UPD 2. К слову, кроме использования type-hinted аргумента Request $request можно использовать конструкцию вида:

<?php
$value 
= \Drupal::request()->request->get('your_posted_variable');  
?>

Комментарии

Аватар пользователя cyberlex404 cyberlex404 9 октября 2020 в 2:37
1

Так он и будет постоянно возвращать 2
Ибо я уверен, что вы не совсем осознаете что такое POST-запрос.

В phpStorm есть встроенный инструмент. Либо любым любым другим способом отправте именно POST запрос. А еще можно проверить на существование методом has()

Аватар пользователя OldWarrior OldWarrior 9 октября 2020 в 5:36
1

Попробуйте явно указать/ограничить метод обращения к контроллеру:

modulemy.json_api:
  path: '/api/json'
  defaults:
    _controller: 'Drupal\modulemy\Controller\JsonApiController::renderApi'
    _title: 'JSON api'
  methods:  'POST'
  requirements:
    _access: 'TRUE'

https://www.drupal.org/docs/drupal-apis/routing-system/structure-of-routes

UPD. Вообще - неплохо бы привести ещё и исходный HTML-код формы. Судя по всему, Drupal Form API не используется.

UPD 2. К слову, кроме использования type-hinted аргумента Request $request можно использовать конструкцию вида:

<?php
$value 
= \Drupal::request()->request->get('your_posted_variable');  
?>