2012-10-12 117 views
7

El servidor no aceptará ningún parámetro en una URL de solicitud, por lo que necesito eliminar todos los parámetros adicionales en la URL y, por supuesto, no puedo controlar el servidor.¿Puedo hacer una solicitud jQuery JSONP sin agregar el parámetro '? Callback =' en la URL?

jQuery:

$.ajax({ 
    type: 'GET', 
    url: 'http://cross-domain.com/the_jsonp_file, 
    jsonpCallback: 'jsonCallback', 
    contentType: 'application/json', 
    cache: 'true', 
    dataType: 'jsonp', 
    success: function(json) { 
     console.log(json); 
    }, 
}); 

El archivo JSONP:

jsonCallback({"test": "hello"}); 

Cuando envío esa petición Ajax, la URL tiene el siguiente aspecto:

http://cross-domain.com/the_jsonp_file?callback=jsonCallback 

pero necesito esto (sin parámetros):

http://cross-domain.com/the_jsonp_file 

EDIT:

Aquí está toda mi situación:

function MyClass(imgs) { 
    // imgs is array of URLs 
    this.imgs = imgs; 

    this.submit = function() { 
     // button click event triggers this method 
     this._show(); 
    }; 

    this._show = function() { 
     var _this = this; 

     for (var i = 0; i < _this.imgs.length; i++) { 
      (function($, j) { 
       $.ajax({ 
        type: 'GET', 
        url: _this.imgs[j], 
        jsonp : false, 
        jsonpCallback: 'jsonCallback', 
        cache: 'true', 
        dataType:'jsonp', 
        success: function(json) { 
         console.log(_this.imgs[j]); 
           }, 
       }); 
      })(jQuery, i); 
     }; 
    }; 
}; 

Y tengo este mensaje de error:

Uncaught TypeError: Property 'jsonCallback' of object [object Window] is not a function 

lo raro es que algunas solicitudes están llamando éxito jsonCallback.

+0

El servidor rechaza las solicitudes con cadenas de consulta en total? –

+1

Puede que sea mejor que escriba el código JSONP usted mismo, en lugar de usar jQuery ... – lonesomeday

+0

Intenté 'dataType: 'script'' en configuración ajax y está haciendo URL sin ningún parámetro, pero no tengo idea de cómo hacer la devolución de llamada función funcionando. – Jonypoins

Respuesta

9

Compruebe la documentación de jQuery - dicen que decir jsonp: falso y jsonpCallback: 'callbackFunction' en los argumentos ajax .... como:

$.ajax({ 
    url: 'http://cross-domain.com/the_jsonp_file', 
    jsonp : false, 
    jsonpCallback: 'jsonCallback', 
    // contentType: 'application/json', -- you can't set content type for a <script> tag, this option does nothing for jsonp | KevinB 
    cache: 'true', 
    dataType : 'jsonp' 
}); 

http://api.jquery.com/jQuery.ajax/

+0

Gracias. parece funcionar pero recibí este mensaje de error: 'Uncaught TypeError: Property 'jsonCallback' del objeto [object Window] no es una función'. Los pocos elementos con éxito llaman a la función de devolución de llamada. – Jonypoins

+0

@Jonypoins ¿Estás utilizando jQuery 1.5+? –

+0

Estoy usando jQuery 1.8.2 – Jonypoins

0

JSONP requiere una devolución de llamada como parte de la URL Supongo que basándome en la descripción de que el servidor al que está accediendo no es compatible con JSONP.

jQuery agrega una etiqueta de secuencia de comandos a su documento, que cuando se agrega ejecuta la solicitud de la API, la respuesta llama a la función de devolución de llamada en su código (esto lo está simplificando).

Puede consultar la Wikipedia si desea una descripción más precisa. http://en.wikipedia.org/wiki/JSONP#How_it_works

+0

Sí, el servidor no es compatible con JSONP pero quiero usar recursos del servidor usando JSONP. – Jonypoins

+2

Lamentablemente, el servidor debe ser compatible con JSONP para que funcione. De lo contrario, obtendrá el error de secuencia de comandos mencionado anteriormente. Tiene otras 2 opciones: 1. Configurar un proxy. 2. CORS (esto también requiere la configuración del servidor) – Dcullen

+0

"Cada solicitud llama a la misma devolución de llamada jsonCallback, así que pensé que ese era el problema". - este fue mi problema Gracias. +1 – offset

1

Cada solicitud llama a la misma devolución de llamada jsonCallback, así que pensé que ese es el problema.

En primer lugar, Javascript en el documento:

<script type="text/javascript"> 
    new Gallery([ 
     ['http://cross-domain.url/whatever', '27b2afa5c77c2510'], 
     ['http://cross-domain.url/whatever', '13df51b2f2801bc1'], 
     ['http://cross-domain.url/whatever', '4de326fc9a2c5a24'], 
     ['http://cross-domain.url/whatever', '60c266a73ba699bc'], 
     ['http://cross-domain.url/whatever', '3db01e95aaf2b9f2'], 
     ['http://cross-domain.url/whatever', '94eb17f9b0e1be9c'], 
     ['http://cross-domain.url/whatever', 'ca8c5c3c0b8cd5ae'], 
     ['http://cross-domain.url/whatever', '6b0f5c5737ee88fd'], 
     ['http://cross-domain.url/whatever', '318d8ebb51a97a15'], 
     ['http://cross-domain.url/whatever', 'f5028c8b62e81a8b'], 
    ]); 
</script> 

subidas cliente JSONP archivo (de ser un archivo Javascript) al servidor como este:

jsonCallback_27b2afa5c77c2510({"test": "hello"}); 

Añadido cadena hexadecimal azar después de jsonCallback_ para separar cada solicitudes como la devolución de llamada predeterminada de jQuery sí.

Leer cadena hexadecimal aleatorio de la entrada y se establece como jsonpCallback:

function Gallery(imgs) { 
    // imgs is array of URLs 
    this.imgs = imgs; 

    this.submit = function() { 
     // button click event triggers this method 
     this._show(); 
    }; 

    this._show = function() { 
     var _this = this; 

     for (var i = 0; i < _this.imgs.length; i++) { 
      (function($, j) { 
       $.ajax({ 
        type: 'GET', 
        url: _this.imgs[j][0], 
        jsonp : false, 
        jsonpCallback: 'jsonCallback_' + _this.imgs[j][1], 
        cache: 'true', 
        dataType:'jsonp', 
        success: function(json) { 
         // Process 
         console.log(json.test); 
        }, 
       }); 
      })(jQuery, i); 
     }; 
    }; 
}; 

Gracias @ Adam @ Kevin B @Dcullen y todo el mundo!: D

p.s: He escrito todas las fuentes anteriores solo por ejemplo, es posible que no sea correcta.

Cuestiones relacionadas