getJSON

Hace poco en un proyecto tuve que integrar información entre un html y un servlet (struts), tenia que ser con AJAX mediante un html generado con un javascript incrustado en cualquier dominio, claramente no es posible utilizar AJAX si el html esta en un dominio distinto al servidor que envía la respuesta, pero se puede hacer algo similiar.

¿Que hacer?

Existe una libreria llamada JSONP que permite incrustar archivos javascript despues de haber cargado la página y justamente es lo que utiliza la función $.getJSON() de jQuery.

¿Como generar un JSON “leible” por $.getJSON()?

Primero que nada, para consumir un JSON remoto debemos enviar el parametro jsoncallback y con valor “?”, despues en struts lo concatenamos a la respuesta que generemos. Es importante hacer esto ya que de otra forma no funcionará.

Por ejemplo si el JSON generado es:

{"nombre":"andres","edad":24}

La respuesta en struts debe quedar así.

?({"nombre":"andres","edad":24})

Por lo tanto, desde el lado del cliente debemos llamar de la siguiente manera al action de struts.

$.getJSON("http://10.10.20.101:8080/proyecto/controller.do?action=obtenerJson&jsoncallback=?",

function(data){}

//Imprimimos nombre

alert(data.nombre);

);

Del lado del servidor generamos así la respuesta

public ActionForward obtenerJson(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

//Guardamos en una variable el JSON

String json = "{\"nombre\":\"Andres\",\"edad\":\"24\"}";

//Capturamos el parametro

String callback = request.getParameter("jsoncallback");

//Concatenamos la respuesta y dejamos entre parentesis la respuesta

String jsonOutput = callback + "(" + json + ")";

//Enviamos al jsp

request.setAttribute("variable",jsonOutput);

return mapping.findForward(forward);

}

2 comments on this post.

  1. Marcos huerta hernandez:

    que tal amigo he provado el ejemplo y nada mas no me aplica sera que me falta algo

  2. Andres:

    Tienes que revisar la respuesta del servlet y que quede con el formato correcto. Dame mas detalles y te ayudo.

Leave a comment