JQuery AJAX JSONP erreur "jeton inattendu"

J'essaie de faire un appel de JSONP de domaine croisé chez Chrome, mais je continue de revenir "Uncaught SyntaxError: jeton inattendu:" J'ai essayé: changer le type de contenu de réponse, définir les en-têtes xhr, JSON.stringify, à peu près la plupart Des solutions proposées ici, mais rien n'a fonctionné jusqu'ici 🙁

$.ajax({ type: "POST", url: "https://www.virustotal.com/vtapi/v2/url/report", crossDomain: true, contentType: "application/json; charset=UTF-8", dataType: 'jsonp', data: { apikey: "*", resource: "http://www.1001freefonts.com/font/BaroqueScript.zip" }, jsonp: false, jsonpCallback: receive, success: function (data, textStatus, jqXHR) { console.log("Data retrieved: " + data); } }).done(function () { console.log('I think we are done here'); }) .error(function (e) { console.log(arguments); console.log('something went funny here'); }) .complete(function (xhr, status) { console.log("complete"); if (status === 'error' || !xhr.responseText) { console.log('error'); } else { console.log("data found:" + xhr.responseText); //... } }); }); function receive(saveData) { if (saveData == null) { console.log("DATA IS UNDEFINED!"); // displays every time } console.log("Success is " + saveData); // 'Success is undefined' } 

Dans le débogueur, je peux voir la réponse

 {"permalink": "https://www.virustotal.com/url/b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772/analysis/1360339512/", "url": "http://www.1001freefonts.com/font/BaroqueScript.zip", "response_code": 1, "scan_date": "2013-02-08 16:05:12", "scan_id": "b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772-1360339512", "verbose_msg": "Scan finished, scan information embedded in this object", "filescan_id": "b7e13c0242e9690aba1f3da4b73d9c2e99a9b7fd03f542b55e694a34aaf9eca8-1360339519", "positives": 0, "total": 35, "scans": {"CLEAN MX": {"detected": false, "result": "clean site"}, "MalwarePatrol": {"detected": false, "result": "clean site"}, "ZDB Zeus": {"detected": false, "result": "clean site"}, "K7AntiVirus": {"detected": false, "result": "clean site"}, "Quttera": {"detected": false, "result": "clean site"}, "Yandex Safebrowsing": {"detected": false, "result": "clean site"}, "MalwareDomainList": {"detected": false, "result": "clean site"}, "ZeusTracker": {"detected": false, "result": "clean site"}, "zvelo": {"detected": false, "result": "clean site"}, "Google Safebrowsing": {"detected": false, "result": "clean site"}, "BitDefender": {"detected": false, "result": "clean site"}, "Opera": {"detected": false, "result": "clean site"}, "G-Data": {"detected": false, "result": "clean site"}, "C-SIRT": {"detected": false, "result": "clean site"}, "Sucuri SiteCheck": {"detected": false, "result": "clean site"}, "VX Vault": {"detected": false, "result": "clean site"}, "ADMINUSLabs": {"detected": false, "result": "clean site"}, "SCUMWARE.org": {"detected": false, "result": "clean site"}, "Dr.Web": {"detected": false, "result": "clean site"}, "AlienVault": {"detected": false, "result": "clean site"}, "Malc0de Database": {"detected": false, "result": "clean site"}, "SpyEyeTracker": {"detected": false, "result": "clean site"}, "Phishtank": {"detected": false, "result": "clean site"}, "Avira": {"detected": false, "result": "clean site"}, "Antiy-AVL": {"detected": false, "result": "clean site"}, "Comodo Site Inspector": {"detected": false, "result": "clean site"}, "Malekal": {"detected": false, "result": "clean site"}, "ESET": {"detected": false, "result": "clean site"}, "SecureBrain": {"detected": false, "result": "unrated site"}, "Netcraft": {"detected": false, "result": "clean site"}, "ParetoLogic": {"detected": false, "result": "clean site"}, "URLQuery": {"detected": false, "result": "unrated site"}, "Wepawet": {"detected": false, "result": "unrated site"}, "Minotaur": {"detected": false, "result": "clean site"}}} 

Je l'ai vérifié sur http://jsonlint.com/ et cela montre qu'il s'agit d'un JSON valide.

Voici les en-têtes de réponse

 cache-control:no-cache content-encoding:gzip content-length:695 content-type:application/json date:Wed, 13 Feb 2013 12:00:33 GMT server:Google Frontend status:200 OK vary:Accept-Encoding version:HTTP/1.1 

Quelqu'un a-t-il des idées / suggestions?

Après un test approfondi, il est évident qu'il n'est pas possible de capturer les résultats de l'objet JSON lorsque ajax attend JSONP en retour (en raison de restrictions entre domaines). Bien que l'état de la réponse soit 200.

J'ai essayé d'utiliser les appels JQuery AJAX pour tenter de voir si le résultat peut encore être capturé, même s'il n'y a pas d'erreur d'analyse lancée par le navigateur, mais cela n'a pas semblé possible. Il semble que le texte de réponse arrive dans l'en-tête après la fin du travail de JS.

Comme @Florian F. @Likwid_T @Christoph a suggéré ci-dessus, un script côté serveur est définitivement requis pour le faire fonctionner correctement. D'autres développeurs semblent vouloir utiliser un proxy écrit en C # comme solution.

JSONP ne fonctionne pas dans la boîte.

JSONP contourne la restriction entre domaines en chargeant le résultat dans une balise de script.

Fondamentalement, votre serveur doit être compatible avec JSONP.

Faites tout ce qu'il faut faire sur votre serveur, alors juste avant d'envoyer la réponse:

  1. Vérifiez si la demande a "_callback" configuré
  2. Si configuré, enveloppez votre contenu avec la valeur de _callback.
  3. Envoyez vos données

Exemple de code en PHP:

 $responseString = '{"smthing":"val","smthingelse":"val2"}'; if (isset($_REQUEST['_callback'])) { $responseString = $_REQUEST['_callback'] . '(' . $responseString . ');'; } 

Il exécutera votre fonction anonyme «terminée» avec les arguments appropriés. (JQuery gère tout le reste)

Christoph a raison, vous devez intégrer votre réponse dans votre fonction de rappel, dans votre cas à la fin du fichier PHP:

 echo $_GET['receive'] . '(' . json_encode($yourResultObject) . ');'; 

Ou si vous avez besoin d'un objet plus complexe

 echo $_GET['receive'] . '(' . json_encode(array(name1 => object1, name2 => object2, name3 => object3)) . ');'; 

Vous devrez peut-être modifier un peu, mais, fondamentalement, chaque fois que je reçois un jeton inattendu, c'est presque toujours une erreur de syntaxe qui rend jQuery pas de fonction de rappel.