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 });