Foros del Web » Programando para Internet » Jquery »

Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una solución jquery

Estas en el tema de Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una solución jquery en el foro de Jquery en Foros del Web. B uenas caballeros, Llevo dos dias intentando ( nunca infructuosos, aunque se falle ) pasar correctamente un objeto JSON a php. El Objeto JSON lo ...
  #1 (permalink)  
Antiguo 15/11/2012, 23:22
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una solución jquery

Buenas caballeros,

Llevo dos dias intentando (nunca infructuosos, aunque se falle) pasar correctamente un objeto JSON a php. El Objeto JSON lo paso por la función (que hace de encoder) stringify() , es decir, declaro una variable array "Myvariable" = stringify(ObjetoJSON). Luego utilizo el siguiente metodo para declarar el header : setRequestHeader("Content-type", "application/json", true); , Esto lo he sacado de foros ingleses donde mencionaban que era el estándar a utilizar : 'application/json'


Es decir, en mi archivo Js tengo :

Código Javascript:
Ver original
  1. function CallAjax() {
  2. // la varaible Request es donde esta guardada la instancia XMLHttpRequest;
  3.         y = "{\"nombre\" : [ \"Brais\"]}";
  4.         RT = JSON.stringify(y);
  5.         var url = "ScriptPhpResponseAjaxJson.php"
  6.         Request.open("POST", url,true);
  7.         Request.setRequestHeader("Content-type", "application/json", true);
  8.         Request.send(y);
  9.         Request.onreadystatechange = function(){
  10.             if(Request.readyState == 4) {
  11.             if(Request.status == 200) {
  12.                 alert("El server dijo: " + Request.responseText);
  13.             }
  14.             }
  15.  
  16.         }
  17.     }
  18. }


En PHP simplemente me limito a intentar devolver como respuesta El simple array (para ver simplemente si se entienden), todos mis intentos han sido fallidos.

En PHP :

Código PHP:
Ver original
  1. $FileImput = file_get_contents('php://input');
  2. $FileConverted = array();
  3. $FileConverted = json_decode(FileImput);
  4. echo $FileConverted;

Ps.He intentado usando $HTTP_RAW_POST_DATA en vez de file_get_contents('php://input');

Ps2. lo de que no quiero una solucion jquery viene dado de que al buscar información al respecto, tanto las webs/foros y blog españolas y anglosagones tienen practicamente todo su contenido igual, con una solución mas o menos estándar con jquery, yo no estoy buscando eso, si estuviese buscando una solución jquery no me habría echo falta pedir ayuda, dado el material que hay en google.

Aun no se si lo que falla es por como lo estoy enviando o por como lo estoy recibiendo. Al ejecutar en consola CallAjax() la ventana de alert se despliega (es decir que el php respondió y esta listo) pero no aparece nada después de "El server dijo:"

Última edición por Albuss; 15/11/2012 a las 23:36
  #2 (permalink)  
Antiguo 16/11/2012, 08:07
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

veamos por partes:

pasar un JSON de AJAX ---> PHP:

recuerda que al final todo lo que envíes por AJAX se resume en una petición HTTP, por el cual los parámetros los pasas o por GET, o por POST, siendo éste último (POST) la mejor alternativa; pero de igual forma tienes que convertir la data a enviar en algo válido para que el protocolo HTTP no lo confunda, en tal caso lo que pasas por POST debe tener la misma forma que una URL string.

para ello, puedes pasar el código JSON que generas:

var y = "{\"nombre\" : [ \"Brais\"]}";

codificandolo como URL válida:

var y = "elJSON=" + encodeURIComponent( "{\"nombre\" : [ \"Brais\"]}" );

se supone que $_POST['elJSON'] es lo que te llegue a PHP

prueba y comenta, lo ideal es que uses una consola como FireBug para que veas que es lo que exactamente le envías al servidor

Respuesta de PHP:

Código PHP:
Ver original
  1. $FileImput = file_get_contents('php://input');
  2.     $FileConverted = array();
  3.     $FileConverted = json_decode($FileImput); //OJO te faltó el $
  4.     echo $FileConverted;

por lo que veo aquí, intentas devolver un array PHP previamente devuelto por json_decode, esto sólo te devolverá "Array", si $FileImput ya es un JSON y tu objetivo es devolverlo no tiene sentido decodificarlo.

Acláranos éste punto, espero respuesta
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 16/11/2012, 13:21
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

Gracias por tu respuesta, siento la tardanza, aun me acabo de levantar y me estoy tomando el primer cafe.


Bien, he utilizado exactamente el metodo de enviar y recibir que me has sugerido es decir, en el archivo JavaScritp tengo :

Código Javascript:
Ver original
  1. function CallAjax() {
  2.         var y = "elJSON=" + encodeURIComponent( "{\"nombre\" : [ \"Brais\"]}" );
  3.         var url = "ScriptPhpResponseAjaxJson.php" // También he probado poniéndole la? al final cual si de un protocolo get se tratase.
  4.         Request.open("POST", url,true);
  5.         Request.setRequestHeader("Content-type", "application/json", true);
  6.         Request.send(y);


Y en el script PHP :

Código PHP:
Ver original
  1. $oD = $_POST['elJSON'];
  2. echo $OD;

Simplemente para ver que le estoy enviando, para tratar de ver si coje "algo" , pero me temo que sigue siendo infructuoso, no obtengo ninguna respuesta, en el debugger al examinar la instancia XMLHttpRequest veo que el responseText esta vacio pero que el script se ha ejecutado correctamente (readyState == 4 && status == 200)

  #4 (permalink)  
Antiguo 16/11/2012, 14:55
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

no es de extrañar

oD vs OD
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #5 (permalink)  
Antiguo 16/11/2012, 15:07
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

Es verdad, he restablecido las antiguas :

Código PHP:
Ver original
  1. $imput= $_POST['elJSON'];
  2. echo $imput;

El resultado es el mismo, aunque gracias por declarar ese fallo, aunque JS no es un lenguaje fuertemente tipado, cosas así te pueden hacerlo pasar muy mal.


El responseText sigue estando vacio al mirar el objeto Request en el debugger.
  #6 (permalink)  
Antiguo 16/11/2012, 15:53
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

prueba con esta otra cabecera
Cita:
Request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded", true);
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #7 (permalink)  
Antiguo 16/11/2012, 16:22
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

IsaBelM muchas gracias, al parecer era la pieza que faltaba, Me gustaria abusar un poco mas y preguntarte por que esa cabecera hace que funcione y no la propia para enviar un json : "application/json" En los foros anglosajones todos los ejemplos que lei utilizaban este ultimo.
  #8 (permalink)  
Antiguo 17/11/2012, 18:39
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

Lo que te señala @IsabelM es que al pasar por POST, como convencionalmente hace un form tenés que enviar también
Request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded", true);, lo cual no es necesario si hicieses GET (pensá que una simple query string con variables en una url sería recibida como get por tu php)
application/json será en todo caso, un header extra generado en la respuesta para indicar el mime correcto de un archivo con formato json (incluso aquel que se genere a través de un php)

Generalmente los servidores Web tienen definidos los mimes correctos según las extensiones. Con Json no siempre se da el caso, ya que su generación puede provenir por distintas vías, y en algunos casos hay que definirlo

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #9 (permalink)  
Antiguo 17/11/2012, 19:54
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

De lujo!, ni siquiera en stockoverflow (el mayor foro/comunidad de proramadores anglosajon) alguien puede encontrar una solucion/respuesta tan exaustiva
  #10 (permalink)  
Antiguo 17/11/2012, 20:17
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

Cita:
Iniciado por Albuss Ver Mensaje
Me gustaria abusar un poco mas y preguntarte por que esa cabecera hace que funcione y no la propia para enviar un json : "application/json" En los foros anglosajones todos los ejemplos que lei utilizaban este ultimo.
¡justo lo que pensaba! lee este tema de stackoverflow, http://stackoverflow.com/questions/9...equest-payload. primero tienes que tener en cuenta que un content type es una forma de indicar el tipo de documento. piensalo de esta forma... cuando el navegador hace un request de algún recurso, el servidor inicializa la cabecera Content-Type. esto básicamente le dice al cliente el tipo de aplicación que debe utilizar para leer el recurso. de modo que text/html lo analiza un motor html y un image/jpeg lo analiza otra aplicación para crear la imagen en pantalla. (obvio, todas estas mini aplicaciones estan vinculadas al navegador o cliente.)

ahora bien, según como yo lo entiendo. en el proceso inverso donde es el cliente quien envía la data al servidor, el contenido puede sufrir una transformación según el content type indicado. en el caso de la variable php $_POST, este contenedor además de estar vinculado al método de envio POST también esta vinculado al content type application/x-www-form-urlencoded. cuando tu le indicas a ajax que ese es el content-type a enviar, el navegador toma la data y la transforma según las especificaciones de ese content type. entonces, al tu cambiar el content type por application/json, la preparación del contenido es distinta a application/x-www-form-urlencoded. es por eso que no puedes leer el json desde $_POST. en ese caso tienes que buscar otra alternativa donde el lenguaje servidor (php en tu caso) lea el payload del request. en php parece que es mediante un wrapper con url php://input.

no tengo idea de lo que leistes en las otras webs, pero estoy casi seguro que iba aplicado en algún contexto, quizas jquery. notese que jquery tiene su propia manera y probablemente al final esta generando una petición distinta al content type indicado en ajax.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #11 (permalink)  
Antiguo 17/11/2012, 21:28
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

zerokilled, fijate en el primer script php que puse :
Código PHP:
Ver original
  1. $FileImput = file_get_contents('php://input');
  2.     $FileConverted = array();
  3.     $FileConverted = json_decode($FileImput); //OJO te faltó el $
  4.     echo $FileConverted;

maycolalvarez Ya me dijo que era un error decodificar algo que habia pasado ya como un array, pero esto de todas maneras, tendria que devolver algo, y en el debugger el responseText esta completamente vació. Incluso probé ejecutando response "a secas" ¿cual era el resultado? e devolvia un valor Null.Segun lo que acabas de decir, en el segundo ejemplo cuando enviaba el objeto json de esta forma a php : encodeURIComponent( "{\"nombre\" : [ \"Brais\"]}" ); deberia devoverme algun tipo de response/responsetext , ¿por que no me devolvía nada? recuerda que estaba utilizando justamente el setRequestHeader("Content-type", "application/json").


Ps. actualmente php o al menos el php que me provee mi hosting tiene integradas la bilbioteca Json, es decir los metodos decoder/encoder y Json_services: como nativos, la cabecera debería ser valida.
  #12 (permalink)  
Antiguo 17/11/2012, 22:16
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

al menos esto a mi me funciona.
Código PHP:
<?php
$content 
file_get_contents('php://input');
echo 
$content;
?>
Código:
// desde la consola ;
var rq = new XMLHttpRequest();
rq.open('post', 'url', true);
rq.setRequestHeader('Content-Type', 'application/json');
rq.send('{"payload":"data"}');
el ejemplo anterior me regresa justo lo que le envio por send. http://phpscripting.awardspace.us/payload/
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #13 (permalink)  
Antiguo 17/11/2012, 22:21
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 3 meses
Puntos: 30
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

Ok, mirare por curiosidad de forma exhaustiva el primer código, quiero ver que fallaba, de todas maneras en este post he aprendido bastante, gracias a todos por haber participado.
  #14 (permalink)  
Antiguo 18/11/2013, 13:05
 
Fecha de Ingreso: noviembre-2013
Mensajes: 1
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Problema al enviar mediante POST un objeto JSON [AJAX]-NO busco una soluci

Hola, suelo no compartir mis soluciones, pero hoy lo veo de otra forma, un aporte. Aqui va mis solucion que jamas falla en ningun navegador (ni siquiera en explorer 8 de laptops hp desactualizadas), bien:

<script>
function ini(){
$.ajax({ url : 'php/php_con_headers_json.php' , data: { tok : token_de_sesion , id : algun_dato } , dataType:'jsonp' , type: 'POST' })

}

$( pini )
<script>

/// esto haria que al cargarse este codigo (si esta en el documento, se ejecutará al inicio) se
lanza una consulta ajax utilizando jQuery.

/// del lado del servidor recibimos la consulta:
<?php
header('content-type: application/json; charset=utf-8');
include "conexion.php"; // configuracion mysql

$s = "SELECT undato FROM registros";
$q = mysql_query($s,$con);// $con es una variable de conexion.php
$nr = mysql_num_rows($q);

echo "$('#cantidad_de_datos').html('$nr');";
?>

/// el archivo php responde utilizando javascript. Esto permite un trabajo que en mi experiencia es muy comodo para vincular la consulta y la respuesta en un solo archivo.

valoro mucho tu voto!!
Saludeee

pd: un ejemplo de esto lo ves en un proyecto que estoy trabajando que se llama 120s.com.ar , presionan "ctrl-u" para ver el codigo fuente, y en el codigo, en la linea 115 pueden acceder al archivo JavaScript que hace una consulta para cargar todo el codigo js de la pagina.

... ACABO DE LEER SIN JQUERY!!!!! Perdon! Bueno, si ese fuera el caso ahi esta, para mi, la mejor solucion. saludos

Última edición por domSurgeon; 18/11/2013 a las 14:20

Etiquetas: ajax, file_get_contents, header, json, aplicaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 03:03.