jQuery AJAX dominio cruzado

Resuelto Firose Hussain asked hace 14 años • 15 respuestas

Aquí hay dos páginas, test.php y testerver.php.

prueba.php

<script src="scripts/jq.js" type="text/javascript"></script>
<script>
    $(function() {
        $.ajax({url:"testserver.php",
            success:function() {
                alert("Success");
            },
            error:function() {
                alert("Error");
            },
            dataType:"json",
            type:"get"
        }
    )})
</script>

servidor de pruebas.php

<?php
$arr = array("element1",
             "element2",
             array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>

Ahora mi problema: cuando ambos archivos están en el mismo servidor (ya sea localhost o servidor web), funciona y alert("Success")se llama; Si está en servidores diferentes, es decir, testerver.php en el servidor web y test.php en localhost, no funciona y se alert("Error")está ejecutando. Incluso si la URL dentro de AJAX se cambia ahttp://domain.example/path/to/file/testserver.php

Firose Hussain avatar Aug 18 '10 02:08 Firose Hussain
Aceptado

Utilice JSONP .

jQuery:

$.ajax({
     url:"testserver.php",
     dataType: 'jsonp', // Notice! JSONP <-- P (lowercase)
     success:function(json){
         // do stuff with json (in this case an array)
         alert("Success");
     },
     error:function(){
         alert("Error");
     }      
});

PHP:

<?php
$arr = array("element1","element2",array("element31","element32"));
$arr['name'] = "response";
echo $_GET['callback']."(".json_encode($arr).");";
?>

El eco puede estar incorrecto, ha pasado un tiempo desde que usé php. En cualquier caso, es necesario tener en callbackName('jsonString')cuenta las comillas. jQuery pasará su propio nombre de devolución de llamada, por lo que deberá obtenerlo de los parámetros GET.

Y como publicó Stefan Kendall, $.getJSON() es un método abreviado, pero luego debe agregarlo 'callback=?'a la URL como parámetro GET (sí, el valor es ?, jQuery lo reemplaza con su propio método de devolución de llamada generado).

BGerrissen avatar Aug 17 '2010 19:08 BGerrissen

JSONP es una buena opción, pero existe una forma más sencilla. Simplemente puede configurar el Access-Control-Allow-Originencabezado en su servidor. Configurarlo en *aceptará solicitudes AJAX entre dominios desde cualquier dominio. ( https://developer.mozilla.org/en/http_access_control )

Por supuesto, el método para hacer esto variará de un idioma a otro. Aquí está en Rails:

class HelloController < ApplicationController
  def say_hello
    headers['Access-Control-Allow-Origin'] = "*"
    render text: "hello!"
  end
end

En este ejemplo, la say_helloacción aceptará solicitudes AJAX de cualquier dominio y devolverá una respuesta de "¡hola!".

A continuación se muestra un ejemplo de los encabezados que podría devolver:

HTTP/1.1 200 OK 
Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Type: text/html; charset=utf-8
X-Ua-Compatible: IE=Edge
Etag: "c4ca4238a0b923820dcc509a6f75849b"
X-Runtime: 0.913606
Content-Length: 6
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-07-09)
Date: Thu, 01 Mar 2012 20:44:28 GMT
Connection: Keep-Alive

Por muy fácil que sea, tiene algunas limitaciones del navegador. Consulte http://caniuse.com/#feat=cors .

jrh avatar Mar 01 '2012 20:03 jrh

Puede controlar esto a través del encabezado HTTP agregando Access-Control-Allow-Origin . Establecerlo en * aceptará solicitudes AJAX entre dominios desde cualquier dominio.

Usar PHP es realmente simple, simplemente agregue la siguiente línea en el script al que desea tener acceso fuera de su dominio:

header("Access-Control-Allow-Origin: *");

No olvide habilitar el módulo mod_headers en httpd.conf.

Adorjan Princz avatar Nov 29 '2014 10:11 Adorjan Princz