Estoy tratando de reescribir mi código JQuery $.post() a través de la función fetch() nativa. Y parece que la única forma de hacerlo con el código del servidor PHP es usando file_get_contents("php://input") . Lo hago como se muestra aquí y aquí :
codigo js:
fetch('/myscript.php', { method: 'post', mode: "same-origin", credentials: "same-origin", body: JSON.stringify({par1:par1, par2:par2}) }).then(response => response.text()) .then(output => { // do stuff });miscript.php:
$input = json_decode(file_get_contents('php://input'), true); // do stuff with $input['par1'], $input['par2'] echo $output;Hay dos cosas que me preocupan:
El proyecto tiene más de una llamada de búsqueda como esta. ¿Qué pasa si se llaman dos funciones de búsqueda simultáneamente con dos archivos de script php diferentes? Ambos accederán a php://input al mismo tiempo. ¿No conducirá a un conflicto?
Con $.post() pude comprobar si myscript.php no ha sido llamado directamente por un hacker con esta línea de código:
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') die('Hack attempt!');
pero con el nuevo enfoque $_SERVER['HTTP_X_REQUESTED_WITH'] no está definido por algún motivo. ¿Hay alguna manera de garantizar que myscript.php se llame con fetch o php://input lo garantice automáticamente?
fetch es una función bastante moderna, pero json_decode(file_get_contents('php://input'), true) parece bastante extraño y está destinado a algún otro caso de uso. ¿No hay una mejor manera de obtener datos de un servidor basado en php?
php://input . fetch('/myscript.php', { method: 'post', mode: "same-origin", headers: {"X-Requested-With": "XMLHttpRequest"}, credentials: "same-origin", body: JSON.stringify({par1:par1, par2:par2}) }).then(response => response.text()) .then(output => { // do stuff });$_POST como con las formas normales. fetch('/myscript.php', { method: 'post', mode: "same-origin", headers: { "X-Requested-With": "XMLHttpRequest", "Content-type": "application/x-www-form-urlencoded" }, credentials: "same-origin", body: `par1=${encodeURIComponent(par1)}&par2=${encodeURIComponent(par2)}` }).then(response => response.text()) .then(output => { // do stuff });