Esta división fue aprobado por nuestros expertos para asegurar la veracidad de este post.
Solución:
Obtuve mucha información aquí, así que quería publicar una solución que descubrí.
El problema: Obtener datos JSON de Javascript en el navegador, al servidor y hacer que PHP los analice con éxito.
Ambiente: Javascript en un navegador (Firefox) en Windows. Servidor LAMP como servidor remoto: PHP 5.3.2 en Ubuntu.
Lo que funciona (versión 1):
1) JSON es solo texto. Texto en un formato determinado, pero solo un texto string.
2) En JavaScript, var str_json = JSON.stringify(myObject)
me da el JSON string.
3) Uso el objeto AJAX XMLHttpRequest en Javascript para enviar datos al servidor:
request= new XMLHttpRequest()
request.open("POST", "JSON_Handler.php", true)
request.setRequestHeader("Content-type", "application/json")
request.send(str_json)
[... code to display response ...]
4) En el servidor, código PHP para leer el JSON string:
$str_json = file_get_contents('php://input');
Esto lee los datos POST sin procesar. $str_json
ahora contiene el JSON exacto string desde el navegador.
Lo que funciona (versión 2):
1) Si quiero usar el "application/x-www-form-urlencoded"
encabezado de solicitud, necesito crear un POST estándar string de "x=y&a=b[etc]"
para que cuando PHP lo obtenga, pueda ponerlo en el $_POST
de asociación array. Entonces, en Javascript en el navegador:
var str_json = "json_string=" + (JSON.stringify(myObject))
PHP ahora podrá completar el $_POST array cuando envío str_json a través de AJAX/XMLHttpRequest como en la versión 1 anterior.
Visualización del contenido de $_POST['json_string']
mostrará el JSON string. Usando json_decode() en $_POST array elemento con el json string decodificará correctamente esos datos y los pondrá en un array/objeto.
El escollo con el que me encontré:
Inicialmente, traté de enviar el JSON string con el encabezado de application/x-www-form-urlencoded y luego traté de leerlo inmediatamente del $_POST array en PHP. El $_POST array siempre estaba vacío. Eso es porque espera datos de la forma yval=xval&[rinse_and_repeat]. No encontró tales datos, solo el JSON string, y simplemente lo tiró. Examiné los encabezados de solicitud y los datos POST se enviaban correctamente.
De manera similar, si uso el encabezado application/json, nuevamente no puedo acceder a los datos enviados a través de $_POST array. Si desea utilizar el encabezado de tipo de contenido application/json, debe acceder a los datos POST sin procesar en PHP, a través de php://input, no con $_POST.
Referencias:
1) Cómo acceder a los datos POST en PHP: ¿Cómo acceder a los datos POST en PHP?
2) Detalles sobre el tipo de aplicación/json, con algunos objetos de muestra que se pueden convertir en cadenas JSON y enviar al servidor: http://www.ietf.org/rfc/rfc4627.txt
Archivo Javascript usando jQuery (más limpio pero sobrecarga de la biblioteca):
$.ajax(
type: 'POST',
url: 'process.php',
data: json: JSON.stringify(json_data),
dataType: 'json'
);
Archivo PHP (proceso.php):
directions = json_decode($_POST['json']);
var_dump(directions);
Tenga en cuenta que si usa funciones de devolución de llamada en su javascript:
$.ajax(
type: 'POST',
url: 'process.php',
data: json: JSON.stringify(json_data),
dataType: 'json'
)
.done( function( data )
console.log('done');
console.log(data);
)
.fail( function( data )
console.log('fail');
console.log(data);
);
Debe, en su archivo PHP, devolver un objeto JSON (en formato javascript), para obtener un resultado de ‘terminado/éxito’ en su código Javascript. Como mínimo devolver/imprimir:
print('');
Ver la solicitud de Ajax devuelve 200 OK, pero se activa el evento de error en lugar del éxito
Aunque para algo un poco más serio, debería enviar un encabezado adecuado explícitamente con el código de respuesta apropiado.
Ejemplo simple en JavaScript para campos de entrada HTML (enviar al servidor JSON, analizar JSON en PHP y enviar de vuelta al cliente) usando AJAX:
Archivo PHP ajax-test.php:
Received data:
First Name Age
'.$lName.'
'.$age.'