Вызов любой php-функции с помощью общего javascript ajax без jQuery

Я искал множество тем, но не нашел подходящего ответа. Моя цель – иметь гиперссылку HYML, которая вызывает функцию Javascript, выполняющую запрос на отправку AJAX на странице PHP, для выполнения функции PHP, опционально с любым количеством аргументов. Многие темы решали эту проблему для конкретных функций (с определенным именем). Я хочу обобщить запрос на отправку AJAX для использования этой же функции для вызова всех функций PHP.

Это то, что у меня есть, но это не так на PHP-скрипте …

HTML:

<a onclick="call_php('php_function_name', ['arg_1', 'arg_2']);">call</a> <p id="demo"></p> 

Javascript:

 function call_php(fname, args) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { document.getElementById('demo').innerHTML = this.responseText; } }; xhttp.open('POST', 'includes/functions.php', true); xhttp.setRequestHeader('Content-type', 'application/json'); xhttp.send(JSON.stringify({ 'fname': fname, 'args': args })); } 

В Javascript я JSON.stringify() вопросы JSON.stringify() и setRequestHeader() если в этом случае он используется правильно.

PHP, который должен вызывать функцию в своем файле:

 if ($_SERVER['REQUEST_METHOD'] === 'POST') { //header('Content-Type: application/json'); $post = json_decode($_POST/*, true*/); // DO SOMETHING TO CALL: fname(...args); } function php_function_name(arg_1, arg_2) { // A FUNCTION... } 

На PHP я задаю вопрос header('Content-Type: application/json') поскольку он уже определен в Javascript. Но главный вопрос: как написать PHP-код для вызова функции PHP? Кстати: когда я печатаю echo $post он дает предупреждение: json_decode () ожидает, что параметр 1 будет строкой, массив задан …

В руководстве PHP указано, что супер глобальная переменная $_POST содержит только аргументы post для данных типа application/x-www-form-urlencoded или multipart/form-data .

Ассоциативный массив переменных передается текущему скрипту с помощью метода HTTP POST при использовании приложений / x-www-form-urlencoded или multipart / form-data в качестве HTTP Content-Type в запросе.

Однако вы пытаетесь отправить сообщение с телом типа application/json .

Чтобы прочитать исходное тело в PHP, вы можете сделать это :

 $postdata = file_get_contents("php://input"); 

Это даст вам строку всего тела запроса. Затем вы можете json_decode эту строку, чтобы получить желаемый объект JSON.

Что касается части вызова функции, предоставленной в запросе, call_user_func_array будет выполнять работу отлично. Независимо от того, что вы должны делать, это совершенно отдельная проблема. Насколько я понимаю, вы опираетесь на концепцию маршрутизатора и контроллера .

Я написал простой фрагмент того, что, как я думаю, вы хотите сделать:

 <?php switch ($_SERVER['REQUEST_METHOD']) { case 'POST': post_handler(); return; case 'GET': get_handler(); return; default: echo 'Not implemented'; return; } function post_handler() { $raw_data = file_get_contents("php://input"); $req_body = json_decode($raw_data, TRUE); call_user_func_array($req_body['function'], $req_body['args']); } function get_handler() { echo 'This page left intentionally blank.'; } function some_function($arg1, $arg2) { echo $arg1.' '.$arg2; } ?> 

Комментируйте json_decode и выведите свой $ _POST, вызвав print_r ($ _POST); вы должны увидеть свою структуру данных, если это простой массив с ключами данных и значениями, то вам не нужно его декодировать, но если в массиве есть один столбец, и это значение – ваши данные, тогда возьмите его ключ и используйте его для декодирования Контент