jQuery AJAX JSONP error "Token inesperado"

Intento hacer una llamada JSONP de dominio cruzado en Chrome, pero sigo recibiendo "Uncaught SyntaxError: token inesperado". Lo he intentado: cambiar el tipo de contenido de respuesta, establecer encabezados xhr, JSON.stringify, casi la mayoría de las soluciones ofrecidas aquí, pero nada funcionó hasta ahora 🙁

$.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' } 

En el depurador puedo ver la respuesta

 {"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"}}} 

Lo he verificado en http://jsonlint.com/ y muestra que es un JSON válido.

Aquí están los encabezados de respuesta

 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 

¿Alguien tiene alguna idea / sugerencia?

3 Solutions collect form web for “jQuery AJAX JSONP error "Token inesperado"”

Después de una testing exhaustiva, era evidente que no es posible capturar los resultados del object JSON cuando ajax está esperando JSONP a cambio (debido a restricciones entre dominios). Aunque el estado de respuesta = 200.

He estado probando usando llamadas jQuery AJAX, en un bash por ver si el resultado aún se puede capturar, a pesar de que el browser ha lanzado un error de análisis, pero parece que no es posible. Parece que el text de respuesta llega al encabezado después de que se completa el trabajo de JS.

Como @Florian F. @Likwid_T @Christoph ha sugerido anteriormente, definitivamente se requiere una secuencia de commands del lado del server para que funcione correctamente. Otros desarrolladores parecen estar interesados ​​en usar un proxy escrito en C # como una solución.

JSONP no funciona de la caja.

JSONP omite la restricción entre dominios al cargar el resultado en una label de script.

Básicamente, su server debe estar habilitado para JSONP.

Haga lo que sea necesario hacer en su lado del server y luego justo antes de enviar la respuesta:

  1. Verifique si la request tiene el ajuste "_callback"
  2. Si se establece, ajuste su contenido con el valor de _callback.
  3. Envía tus datos

Ejemplo de código en PHP:

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

Ejecutará su function anónima 'hecha' con los arguments correctos. (JQuery maneja todo lo demás)

Christoph está en lo cierto, necesitas include tu respuesta en tu function de callback, en tu caso al final del file PHP:

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

o si necesitas un object más complejo

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

Puede que tengas que modificar un poco, pero básicamente cada vez que obtengo token inesperado casi siempre es un error de syntax que hace que jQuery no obtenga mi function de callback.

  • ¿Cómo se muestra un error de networking real al usuario cuando se utiliza XMLHttpRequest?
  • ¿Es posible que las requestes XHR HEAD no sigan las networkingirecciones (301 302)?
  • fetch - Falta el límite en multipart / form-data POST
  • El acceso se niega en IE11 en AngularJS
  • habilitar el intercambio de resources de origen cruzado en IIS7
  • ¿Es el setInterval () una function asíncrona?
  • ¿Puede XHR desencadenar onreadystatechange varias veces con readyState = DONE?
  • URL de respuesta de xmlhttprequest IE
  • Los browseres Mac parecen tragarse la request de verificación previa de CORS XHR
  • CORS mortal cuando http: // localhost es el origen
  • Cargar file con Ajax XmlHttpRequest
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.