Publicar JSON desde Angular 2 a PHP
Intento enviar datos desde Angular 2 a PHP:
let headers = new Headers();
headers.append('Content-Type', 'application/json');
var order = {'order': this.orders};
this.http.post('http://myserver/processorder.php', JSON.stringify(order), {
headers: headers
}).subscribe(res => {
console.log('post result %o', res);
});
En Angular 2 uno solo puede enviar cadenas como datos y no JSON? Eso está bien para mí, pero tengo problemas para obtener los datos enviados en PHP. Intenté $obj=$_POST['order'];
Respuesta #1
Marc B tiene razón, sin embargo, lo que está sucediendo es que el array $_POST contendrá un valor vacío con una clave establecida en la cadena JSON que estás enviando...
Array
(
[{"order":"foobar"}] =>
)
Puedes "agarrar" eso (aunque este sería el enfoque incorrecto) obteniendo la clave usando...
key($_POST)
por ejemplo:
$obj = json_decode(key($_POST));
echo $obj->order;
PERO lo que puedes hacer es enviar los datos como pares clave-valor:
let headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
let order = 'order=foobar';
this.http.post('http://myserver/processorder.php', order, {
headers: headers
}).subscribe(res => {
console.log('post result %o', res);
});
Luego, en PHP puedes obtener los datos usando:
$_POST['order']
Algunas cosas a tener en cuenta:
- cambié el encabezado Content-Type a application/x-www-form-urlencoded (más para mis propias pruebas ya que esto no realiza ninguna solicitud de preflight)
- nota que order es una cadena de par clave-valor en lugar de JSON
- Observa que order en this.http.post se está pasando tal cual, sin JSON.stringify
Respuesta #2
No sé si es una mala práctica, pero me parece bien, aunque me molesta un poco
const headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
const obj = { nome: 'gabriel', age: 20 };
const body = 'data=' + JSON.stringify(obj);
this.http.post('/test.php', body, { headers })
.subscribe(res => console.log(res.json()), res => console.error(res))
Y en php
$post = json_decode($_POST['data']);
