<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Petici%C3%B3ns_AJAX_cross-domain_con_JSONP</id>
	<title>Peticións AJAX cross-domain con JSONP - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Petici%C3%B3ns_AJAX_cross-domain_con_JSONP"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Petici%C3%B3ns_AJAX_cross-domain_con_JSONP&amp;action=history"/>
	<updated>2026-10-24T15:53:23Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Petici%C3%B3ns_AJAX_cross-domain_con_JSONP&amp;diff=57896&amp;oldid=prev</id>
		<title>Veiga: /* Programación no lado do servidor para responder a peticións JSONP */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Petici%C3%B3ns_AJAX_cross-domain_con_JSONP&amp;diff=57896&amp;oldid=prev"/>
		<updated>2016-01-20T18:18:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Programación no lado do servidor para responder a peticións JSONP&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= A problemática de seguridade coas peticións AJAX =&lt;br /&gt;
&lt;br /&gt;
Unha das limitacións das peticións AJAX é a de que non se poder facer peticións AJAX a dominios alleos ó dominio no que está aloxada a nosa aplicación, é o que se coñece como &amp;quot;Same-origin policy&amp;quot;, para evitar que se carguen mediante JavaScript datos potencialmente inseguros por estar aloxados noutros servidores. É dicir que os datos que cargamos no noso propio dominio son considerados seguros, pero os que están noutros dominios de Internet non.&lt;br /&gt;
&lt;br /&gt;
Esta restricción pode evitarse si o dominio ó cal te conectas está configurado para aceptar conexións dende outros dominios. Isto consíguese activando a configuración &amp;quot;Cross-origin resource sharing&amp;quot; pero tamén pode solucionarse independentemente da configuración do servidor a través do uso de JSONP.&lt;br /&gt;
&lt;br /&gt;
== Aceptar por defecto peticións AJAX dende outros dominios en Apache (Autorización CORS) ==&lt;br /&gt;
&lt;br /&gt;
* Si queremos que o noso dominio acepte peticións AJAX dende outros dominios teremos que configurar o servidor web para responder a esas peticións:&lt;br /&gt;
* Simplemente teremos que engadir a seguinte liña dentro de das seccións &amp;#039;&amp;#039;&amp;#039;&amp;lt;Directory&amp;gt;, &amp;lt;Location&amp;gt;, &amp;lt;Files&amp;gt; ou &amp;lt;VirtualHost&amp;gt;&amp;#039;&amp;#039;&amp;#039; que estarán no arquivo *.conf (httpd.conf ou apache.conf).&lt;br /&gt;
&lt;br /&gt;
* Outra opción tamén sería engadi-lo dentro dun arquivo &amp;#039;&amp;#039;&amp;#039;.htaccess&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Para asegurarnos que está correcto executaremos os seguintes comandos:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Activamos o módulo de cabeceiras en Apache (por defecto debería vir activado)&lt;br /&gt;
a2enmod headers&lt;br /&gt;
&lt;br /&gt;
# Comprobamos o arquivo de configuración de Apache&lt;br /&gt;
apachectl -t&lt;br /&gt;
&lt;br /&gt;
# Reiniciamos o servizo&lt;br /&gt;
service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cómo é JSONP =&lt;br /&gt;
&lt;br /&gt;
JSON e JSONP son basicamente o mesmo, un formato lixeiro para intercambiar datos con notación de obxecto de Javascript. A notación non cambia pero si cambia o &amp;quot;envoltorio&amp;quot;. En JSONP en lugar de viaxar os datos a secas como en JSON, o que viaxa é unha función xeralmente chamada &amp;quot;&amp;#039;&amp;#039;&amp;#039;callback&amp;#039;&amp;#039;&amp;#039;&amp;quot;. Esa función é como un JavaScript que engloba os datos que solicitamos. De ahí que o JSONP sexa coñecido como JSON con Padding.&lt;br /&gt;
&lt;br /&gt;
Exemplo de petición que devolve un JSONP:&lt;br /&gt;
http://api.openbeerdatabase.com/v1/beers.json?callback=mifuncion&amp;amp;query=beer&lt;br /&gt;
&lt;br /&gt;
O que estamos recibindo é unha función como a seguinte:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
mifuncion({  &lt;br /&gt;
  &amp;quot;page&amp;quot;:1,&lt;br /&gt;
  &amp;quot;pages&amp;quot;:1,&lt;br /&gt;
  &amp;quot;total&amp;quot;:1,&lt;br /&gt;
  &amp;quot;beers&amp;quot;:[  &lt;br /&gt;
    {  &lt;br /&gt;
      &amp;quot;id&amp;quot;:87,&lt;br /&gt;
      &amp;quot;name&amp;quot;:&amp;quot;Ginger Beer&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;:&amp;quot;A beer with authenticity and flavour, rich in ginger and citrus notes, spice with a malty sweetness.&amp;quot;,&lt;br /&gt;
      &amp;quot;abv&amp;quot;:2.5,&lt;br /&gt;
      &amp;quot;created_at&amp;quot;:&amp;quot;2013-01-18T15:01:22Z&amp;quot;,&lt;br /&gt;
      &amp;quot;updated_at&amp;quot;:&amp;quot;2013-01-18T15:19:22Z&amp;quot;,&lt;br /&gt;
      &amp;quot;brewery&amp;quot;:{  &lt;br /&gt;
        &amp;quot;id&amp;quot;:51,&lt;br /&gt;
        &amp;quot;name&amp;quot;:&amp;quot;Adnams&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Por qué funciona o JSONP en diferentes dominios e non JSON =&lt;br /&gt;
&lt;br /&gt;
Para facer posible que JSONP funcione en situaciones cross-domain emprégase unha alternativa permitida á carga de scripts nunha páxina.&lt;br /&gt;
Os navegadores sí que aceptan a carga de código JavaScript que se incorpore coa etiqueta &amp;lt;script&amp;gt; e o atributo SRC. É o método que empregamos para cargar por exemplo unha librería de jquery dende un CDN.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debido a que iso non provoca ningún problema de seguridade, JSONP aproveita ese formato para acceder dese modo ó recurso solicitado inxectando ese script na páxina e executando o código para extraer os datos.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Atención: Si nos chegase un JSON normal non poderíamos executa-lo tal cual, xa que o JSON e un obxecto literal e non unha sentencia de Javascript que sexa capaz de executar o navegador, por iso non se podería meter entre as etiquetas SCRIPT da páxina.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= Cómo se procesa un JSONP para extraer os datos =&lt;br /&gt;
&lt;br /&gt;
JQuery facilítanos esa tarefa. Simplemente teremos que indicarlle que o que estamos a recibir en un JSONP en lugar dun JSON.&lt;br /&gt;
&lt;br /&gt;
Se empregamos o método $.ajax teremos que indicarlle na variable de configuración &amp;#039;&amp;#039;&amp;#039;dataType: &amp;quot;jsonp&amp;quot;&amp;#039;&amp;#039;&amp;#039; en lugar de &amp;quot;json&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Por exemplo empregando o método &amp;#039;&amp;#039;&amp;#039;$.ajax()&amp;#039;&amp;#039;&amp;#039; de jQuery:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;jQuery.getJSON demo JSONP&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;style&amp;gt;&lt;br /&gt;
		img {&lt;br /&gt;
			height: 100px;&lt;br /&gt;
			float: left;&lt;br /&gt;
		}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;images&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;script&amp;gt; &lt;br /&gt;
		$.ajax({&lt;br /&gt;
			url: &amp;quot;http://api.openbeerdatabase.com/v1/beers.json&amp;quot;,&lt;br /&gt;
			data: {&lt;br /&gt;
				query: &amp;quot;beer&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			type: &amp;quot;GET&amp;quot;,&lt;br /&gt;
			dataType: &amp;quot;jsonp&amp;quot;,&lt;br /&gt;
			success: function(respuesta){&lt;br /&gt;
				console.log(&amp;quot;Datos recibidos: &amp;quot;, respuesta);&lt;br /&gt;
				$(&amp;quot;&amp;lt;pre&amp;gt;&amp;quot;).text(JSON.stringify(respuesta)).appendTo(&amp;quot;body&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na opción success a función que se executa contén un obxecto JavaScript nativo xa convertido para o seu uso inmediato.&lt;br /&gt;
&lt;br /&gt;
Podemos facer o mesmo exemplo anterior empregando o método &amp;#039;&amp;#039;&amp;#039;$.getJSON()&amp;#039;&amp;#039;&amp;#039; de jQuery moito máis sinxelo:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Atención&amp;#039;&amp;#039;&amp;#039;: é necesario engadir un novo parámetro á URL. Ese novo parámetro é &amp;#039;&amp;#039;&amp;#039;callback&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
Para facer iso pódese facer con &amp;#039;&amp;#039;&amp;#039;?callback=?&amp;#039;&amp;#039;&amp;#039; se é o único parámetro da URL ou ben &amp;#039;&amp;#039;&amp;#039;&amp;amp;callback=?&amp;#039;&amp;#039;&amp;#039; se é o último parámetro (xa temos máis na URL) que queremos engadir. &amp;#039;&amp;#039;&amp;#039;É necesario engadi-lo para que xestione correctamente o JSONP&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;jQuery.getJSON JSONP&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;style&amp;gt;&lt;br /&gt;
		img {&lt;br /&gt;
			height: 100px;&lt;br /&gt;
			float: left;&lt;br /&gt;
		}&lt;br /&gt;
	&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;images&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;script&amp;gt; &lt;br /&gt;
		// Hay que engadir á URL o parámetro ?callback=? e jQuery encárgase do resto.&lt;br /&gt;
		$.getJSON(&amp;quot;http://api.openbeerdatabase.com/v1/beers.json?callback=?&amp;quot;,{query:&amp;quot;beer&amp;quot;},function(respuesta)&lt;br /&gt;
		{&lt;br /&gt;
			console.log(&amp;quot;Recibes: &amp;quot;, respuesta);&lt;br /&gt;
			$(&amp;quot;&amp;lt;pre&amp;gt;&amp;quot;).text(JSON.stringify(respuesta)).appendTo(&amp;quot;body&amp;quot;);&lt;br /&gt;
		});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Programación no lado do servidor para responder a peticións JSONP = &lt;br /&gt;
&lt;br /&gt;
Os servidores tamén teñen que estar preparados para dar respostas a peticións de este tipo e para iso terán que facer algo como o seguinte exemplo en PHP que devolverá un JSONP cando se lle pasa como parámetro GET &amp;#039;&amp;#039;&amp;#039;callback&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
O parámetro a pasar na petición dependerá do servidor ó que nos conectemos, pero si todos seguen o estandar deberían usar como parámetro GET &amp;#039;&amp;#039;&amp;#039;callback&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if (isset($_GET[&amp;#039;callback&amp;#039;]))&lt;br /&gt;
  echo $_GET[&amp;#039;callback&amp;#039;] . &amp;#039;(&amp;#039; .json_encode($datos). &amp;#039;)&amp;#039;;&lt;br /&gt;
else&lt;br /&gt;
  echo json_encode($datos);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[Usuario:Veiga|Veiga]] ([[Usuario discusión:Veiga|discusión]]) 19:18 20 ene 2016 (CET)&lt;/div&gt;</summary>
		<author><name>Veiga</name></author>
	</entry>
</feed>