2013-01-03 10 views
18

Ho un client API che effettua una richiesta JSONP utilizzando JQuery. Tutto funziona correttamente quando questo client API non utilizza SSL, tuttavia, fallisce quando viene utilizzato SSL.La richiesta JSONP ha esito negativo quando viene utilizzato https anziché http

Per esempio ho un URL http://apiclient.com e sto facendo seguente richiesta JSONP da questo dominio:

$.ajax({ 
    url: url, 
    dataType: "jsonp", 
    contentType: "application/json; charset=utf-8", 
    success: function(data) 
    { 
     $.each(data.services, function(index, service) { 
      processService(service); 
     }); 
    } 
}); 

vedo apposita richiesta fatta ospite API specificato nell'URL e la funzione di callback nel successo viene chiamata correttamente con dati formattati correttamente passati su di esso.

Tuttavia quando cambio sopra URL del client API per https://apiclient.com, nessuna richiesta si osserva a Host API. Non vedo errori in entrambi i lati dei registri.

Nota: unica differenza è http a https sul lato client API.

È necessario gestire la richiesta JSONP in modo diverso quando si utilizza il dominio https?

Grazie.

Modifica: Questo problema si verifica solo con Chrome. Funziona con Firefox e Safari. Tuttavia ho ricevuto un avviso rapido su FireFox che mi chiedeva di effettuare una richiesta non crittografata dal sito crittografato . L'ho permesso e non ho più visto l'avviso.

+3

Il server è configurato per accettare le richieste Https? Alla tua domanda ajax, aggiungi anche una funzione di errore e controlla se riscontri degli errori. – ryadavilli

+2

Puoi chiamare normalmente l'URL dell'API https? Forse c'è un errore del certificato o qualcosa del genere? – AndreKR

+1

@ryadavilli no Gestore di errori AJAX per richieste 'jsonp'. Vedere documenti ** Nota: questo gestore non viene chiamato per richieste di script e JSONP tra domini. ** – charlietfl

risposta

11

Trovato una soluzione. Il problema era che JQuery e altre risorse venivano importate da siti non sicuri. La soluzione era di fare riferimento da https.

1

Non ci dovrebbero essere differenze nella richiesta JSONP per http e https.

Metteteci alla prova GetJSON invece:

$.getJSON(url, function(data) { 
    $.each(data.services, function(index, service) { 
     processService(service); 
    }); 
}); 

Utilizzando jQuery.ajax() causerà problema cross-browser, ma non è il caso con jQuery.getJSON() un'occhiata al sito jQuery per ulteriori informazioni: http://api.jquery.com/jQuery.getJSON/

C'è post simile a questo problema: JSONP To Acquire JSON From HTTPS Protocol with JQuery

+1

$ .getJSON è una mano corta per $ .ajax, quindi il comportamento è identico. – Mayumi

1

Modifica del protocollo è lo stesso effetto di cambiare qualsiasi altra parte dell'URL - innescherà una violazione della politica stessa origine e forc sei tu in modalità cross-domain. Se hai già un accesso interdominio funzionante, continuerà a funzionare con https e con http.

è possibile utilizzare getJSON per esempio

$.getJSON('ajax/test.json', function(data) { 
    $('.result').html('<p>' + data.foo + '</p>' 
    + '<p>' + data.baz[1] + '</p>'); 
}); 

controllo completo getJSON documentazione http://api.jquery.com/jQuery.getJSON/

volontà mi sbagliavo ... usando Juqery.ajax causerà problema cross-browser, ma non con jQuery.getJSON

http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29

ecco un esempio di cross-domain ottenere JSON

Firefox ha un problema con HTTPS, come so che verrà risolto se si invia la richiesta come questo

$.getJSON('ajax/test.json',{}, function(data) { 
    $('.result').html('<p>' + data.foo + '</p>' 
    + '<p>' + data.baz[1] + '</p>'); 
}); 

soruce AJAX https POST requests using jquery fail in Firefox

spero che questo aiuta

+0

Prima nel mio caso funziona tutto senza http e non funziona con https. Quindi la stessa politica di origine non è un problema qui, e sto usando GET non POST. Credo che $ .getJSON sia solo una piccola mano per $ .ajax come affermato nella documentazione. La tua soluzione non risolve il problema. – Mayumi

+0

Penso che quello che potrebbe essere il problema è che i dati restituiti per HTTP e HTTPS non sono gli stessi. In questo caso, cerca di ottenere l'URL da Fiddler, specificando Content-Type come application/json, utilizzando entrambi i protocolli HTTP e HTTPS. Quindi, confronta il risultato di entrambi i protocolli. – stack247

Problemi correlati