Подскажите, как определить POST-запрос для DRUPAL8?
Для формирования GET используется MODULE.routing.yml, затем через AJAX вызывается уже непосредственно в JS-коде... А как поступить, если мне нужен POST-запрос. AJAX переопределил под POST, но получаю ошибку "POST <адрес> 404 (Not Found)", как будто в MODULE.routing.yml я его не определил
Комментарии
https://drupal.stackexchange.com/questions/219128/how-to-send-post-reque...
Не совсем то. У меня проблема заключается в том, что GET-запрос не может слишком длинную строку (параметр может быть большим, идет описание заказа), а такое в теории у меня может быть, поэтому я хочу сделать из GET-запроса POST-запрос..
Сам POST-запрос я сделал из GET-Запроса на JS, однако URL для Друпала стал неизвестен, о чем говорит ошибка. Иными словами мне надо объявить URL, который вызовет выполнение функции на сервере так же, как это выполнял ранее GET-запрос.
Схематично:
$.ajax({
type: 'POST',
url: '/my_modul/kakoeto_nazvanie/', // URL на который отправляеться запрос
success: updateHod, // Функция которая будет вызвана в случае ответа от сервера
dataType: 'json', //Тип данных полученных от сервера
data: 'js=1' //Pass a key/value pair
});
/my_modul/kakoeto_nazvanie/ - вот это надо как-то определить
А контроллер вы сделали?
Да, функция есть, вот что в роутинге:
article.OrderAccept:
path: '/article/OrderAccept/{txtOrder}/{txtPurses}'
defaults:
_controller: '\Drupal\article\Controller\OrderController::Accept'
requirements:
_access: 'TRUE'
У вас метод с большой буквы называется. Так нельзя. Переименуйте метод, а потом пробуйте дебажить. В начале просто откройте указанный роут в браузере, а метод пусть выведет какой-нибудь хэлловорлд. Так вы поймёте, работает ли контроллер вообще. А потом, как заработает, уже наворачивайте плюшки.
А ещё советую установить друпал-консоль. Одной командой drupal gcon вам сгенерируется и роут, и контроллер.
Я переделываю GET в POST - контроллер есть и он работает.
Сделал все с прописных букв. Вызвал напрямую - ругается на отсутствие параметров, что понятно.
Ошибка при выполнении
Controller "Drupal\article\Controller\OrderController::Accept()" requires that you provide a value for the "$txtOrder" argument (because there is no default value or because there is a non optional argument after this one).
Из js я вызываю вот так, возникает 500 ошибка:
-------
Мб что не так
500 ошибка, это уже повод логи сервера посмотреть, может у вас там не догружается чего-то
/my_modul/kakoeto_nazvanie/ определяется через routing
И еще возможно Вам стоит воспользоваться стандартным ajax framework https://api.drupal.org/api/drupal/core!core.api.php/group/ajax/8.5.x
Кое что интересное и может пригодиться по ajax есть еще здесь https://www.drupal.org/project/examples -> ajax
Определено:
article.OrderAccept:
path: '/article/OrderAccept/{txtOrder}/{txtPurses}'
defaults:
_controller: '\Drupal\article\Controller\OrderController::Accept'
requirements:
_access: 'TRUE'
Мб надо параметры убрать или для POST как-то иначе определяются?
Так ошибка 500 или 404?
Была 404, сейчас 500...
А что в журнале?
[31/Mar/2018:20:35:33 +0500] "POST /article/orderaccept HTTP/1.1" 500 1885 "http://mysite.com/ru/main" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
---
всё... у меня на тестовом OpenServer...
А в друпаловском журнале что? В админ-меню пункт отчёты, а там последние записи журнала ( recent log messages).
RuntimeException: Controller "Drupal\article\Controller\OrderController::Accept()" requires that you provide a value for the "$txtOrder" argument (because there is no default value or because there is a non optional argument after this one). in Drupal\Core\Controller\ControllerResolver->doGetArguments() (line 165 of C:\OpenServer\domains\lbcoins.com\core\lib\Drupal\Core\Controller\ControllerResolver.php).
Так вы роут без аргумента вызываете. Если он не нужен, то уберите его из определения роута и из аргументов метода. Либо задайте ему значение по умолчанию в определении метода, типа
function access($arg = NULL) { ...}
А как запускать с параметрами? У меня их 2 штуки...
Соответственно вам нужно отправлять запрос на урл /article/OrderAccept/аргумент/аргумент 2
Вместо слов "аргумент" и "аргумент2" и должны быть ваши аргументы.
Вот в этом и проблема. У меня так сделано. Это же GET запрос, как я понимаю? Я столкнулся с ситуацией, когда длина строки заказа может быть очень большой в теории, поэтому хочу переделать под POST, чтобы не отсылать параметры в строке
Это не гет запрос, а урл. Если не собираетесь передавать аргументы в урле запроса, то во-первых уберите всё что в фигурных скобках в ймл-файле, во вторых, уберите аргументы из метода контроллера.
А как я передам параметры?
Вот запрос у меня такой на JS:
$.ajax({
type: 'POST',
url: '/article/orderaccept',
success: function (data) {
debugger;
},
dataType: 'json',
data: 'txtOrder='+ordertext+'&txtPurses='+pursestext
});
В data - параметры
Они же у вас из аякса идут в теле пост-запроса, соответственно в контроллере их можно достать приблизительно так:
<?php
\Drupal::requestStack()->getCurrentRequest()->request->all();
?>
На выходе должен быль ассоциативный массив с данными пост-запроса.
Да, через массив $_POST они пришли. Просто в процедуре их поймал. Спасибо!
Да, можно и так, только это не процедура, а метод, т.к. контроллер - это класс)) но это уже сугубо терминология.
Ну да) Так точнее. Каждый метод - это проца или функция, но не каждая проца или функция - метод))
Спасибо большое! Очень помог разобраться