Búsqueda de sitios web

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']);

Artículos relacionados