Así que tengo este código:
axios({ method: 'post', url, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: { json, type, } }) Originalmente tenía el axios.post normal, pero lo cambié porque pensé que podría haber sido un problema de encabezado. Sin embargo, sigo sin detectar nada en mi $_REQUEST ni en $_POST . Sin embargo, está recibiendo datos en file_get_contents("php://input") .
¿Alguna idea de lo que está mal?
Editar
Está bien, creo que sé lo que está mal. Lo está publicando como un objeto json, por lo que solo se puede leer en el archivo php://input. ¿Cómo lo cambio a una cadena normal en axios?
De la documentación (no he conservado enlaces en el material citado):
Usando el formato application/x-www-form-urlencoded
De forma predeterminada, axios serializa objetos de JavaScript en JSON.
PHP no admite JSON como formato de datos para $_POST .
Solo admite los formatos procesables por máquina compatibles de forma nativa con los formularios HTML :
Para enviar datos en el formato application/x-www-form-urlencoded, puede usar una de las siguientes opciones.
Navegador
En un navegador, puede usar la API URLSearchParams de la siguiente manera:
var params = new URLSearchParams(); params.append('param1', 'value1'); params.append('param2', 'value2'); axios.post('/foo', params);Tenga en cuenta que URLSearchParams no es compatible con todos los navegadores, pero hay un polyfill disponible (asegúrese de polyfill en el entorno global).
Alternativamente, puede codificar datos usando la biblioteca qs:
var qs = require('qs'); axios.post('/foo', qs.stringify({ 'bar': 123 }));
O puede personalizar su PHP para que pueda manejar JSON según esta respuesta en otra pregunta.
var params = { data1: 'string', } axios.post(url, params).then(function(response) { //code here });o
axios.post(url, {data1: 'string' }).then(function(response) { //code here });API
$_POST = json_decode(file_get_contents("php://input"),true); echo $_POST['data1'];Para hacer las cosas más fáciles y universales si alguna vez decide cambiar entre bibliotecas AJAX o idiomas de servidor. Con axios use el JS FormData nativo.
Si tiene sus datos en un objeto, puede convertirlos a FormData de esta manera:
var myDataObj = {id:1, name:"blah blah"} var formData = new FormData(); for (var key in myDataObj) { formData.append(key, myDataObj[key]) }Luego envías los datos:
axios.post('/sub/process.php', formData, { params: { action: "update-user" }, headers: { 'Content-Type': 'multipart/form-data' }, baseURL: 'http://localhost', }).then(data => console.log(data) ).catch(err => { console.log(err) return null }) Tenga en cuenta que también puede enviar información usando params en axios que puede recuperar usando $_GET . También tenga en cuenta que estoy usando la baseURL en caso de que tenga diferentes servidores para la página web y su punto final de API.
También debe comprender que antes de que axios envíe la solicitud real, realiza una solicitud de preflight previa. Una solicitud de verificación previa es un mecanismo en CORS por parte del navegador para verificar si el destino del recurso está dispuesto a aceptar la solicitud real o no. Después de todo, ¿por qué se enviaría una solicitud cuando el host de destino no está dispuesto a recibirla de todos modos?
Debe asegurarse de que su servidor tenga los encabezados correctos para su solicitud de axios; de lo contrario, la solicitud de verificación previa detectará la incompatibilidad y detendrá su solicitud:
//this is if you are using different different origins/servers in your localhost, * to be update with the right address when it comes to production header('Access-Control-Allow-Origin: *'); //this is if you are specifying content-type in your axios request header("Access-Control-Allow-Headers: Content-Type"); Ahora, podrá acceder a sus datos enviados en la variable $_POST :
echo "<pre>"; print_r($_POST); echo "</pre>";Además, axios le permite enviar datos en diferentes formatos. puedes enviar un json por ejemplo como este:
axios.post('/sub/process.php', { id: "1", name:"blablah" }, { params: { action: "update-item" }, headers: { 'Content-Type': 'application/json' }, baseURL: 'http://localhost', }).then(data => console.log(data) ).catch(err => { console.log(err) return null })En el lado de PHP, se puede acceder a esto de la siguiente manera:
$data = json_decode(file_get_contents("php://input"),true); echo "<pre>"; print_r($data); echo "</pre>";