2013-02-13 6 views
4

Я пытаюсь сделать междоменный JSONP вызова в Chrome, но я получаю обратно «неперехваченный SyntaxError: Неожиданный маркер:» Я пробовал: изменение тип содержимого ответа, настройка XHR заголовки, JSON.stringify, только о большинстве решений, предлагаемых здесь, но ничего не работает до сих пор :-(JQuery AJAX JSONP ошибка «Неожиданный маркер»

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

В отладчике я вижу ответ

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

Я проверил его на http://jsonlint.com/, и он показывает, что это действительный JSON.

Вот заголовки ответа

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 

Кто-нибудь есть какие-либо идеи/предложения?

+2

Для JSONP вам нужна функция. Обычный объект JSON не является действительным ответом JSONP. Действительно ли сервер способен обслуживать JSONP-ответы? – Christoph

+0

Также 'dataType: 'jsonp', jsonp: false' выглядит неправильно. – Christoph

+1

@Christoph Re 'dataType: 'jsonp', jsonp: false' они верны, проверьте документацию по адресу http://api.jquery.com/jQuery.ajax/ – Eric

ответ

1

JSONP не работает из коробки.

JSONP обходит междоменное ограничение, загружая результат в тег скрипта.

В основном, ваш сервер должен быть включен JSONP.

делать все, что должно быть сделано на вашей стороне сервера, то перед отправкой ответа:

  1. Проверьте, если запрос имеет «_callback» набор
  2. Если установлено, оберните содержание со значением _callback ,
  3. Отправить данные

пример кода в PHP:

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

Он будет выполнять ваши «сделали» анонимную функцию с правильными аргументами. (JQuery обрабатывает все остальное)

+0

Что заставляет вас думать, он может изменить сервер? Если он делает запрос на перекрестный запрос, он, скорее всего, не контролирует это. – Christoph

+0

Потому что это единственное решение, как есть. Crossdomain полезен только при управлении сервером, или если сервер сам принимает его. Следующим решением является создание прокси-сервера в вашем собственном домене, который отправит запрос в веб-сервис. –

+0

@FlorianF. Кристоф прав, у меня нет контроля над сервером. Мой проект ограничен только JS. – Eric

1

Christoph подходит вам нужно упаковать свой ответ в вашей функции обратного вызова, в вашем случае в конце PHP файла:

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

или если вам нужен более сложный объект

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

Вы, возможно, придется подправить немного, но в основном всякий раз, когда я получаю Неожиданный маркер почти всегда ошибка синтаксиса, что делает Jquery не получить свою функцию обратного вызова.

+0

у него нет контроля над сервером, я думаю. В большинстве случаев вам не нужно делать запрос на перекрестный домен. – Christoph

+0

@Likwid_T, к сожалению, серверный скрипт не может быть задействован. Он должен остаться JS. Можно ли применить те же манипуляции в JS? Моя функция обратного вызова не принимает данные, хотя я вижу в заголовке ответа результат результата объекта JSON. – Eric

+0

Подождите, я просто перечитал: вы получаете данные с сервера в ответ? {"permalink": "https: //www.virustotal.com/url/b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772 ... и т. д. Это правильно? –

3

После тщательного тестирования было очевидно, что невозможно получить результаты объекта JSON, когда ajax ожидает JSONP взамен (из-за междоменных ограничений). Несмотря на то, что статус ответа = 200.

Я тестировал использование jQuery AJAX-вызовов, пытаясь увидеть, может ли результат все же быть захвачен - несмотря на то, что в браузере есть ошибка Parsing, но, похоже, это не так. возможное. Похоже, что текст ответа поступает в заголовок после завершения работы JS.

Как предложил @Florian F. @Likwid_T @Christoph, серверный скрипт определенно необходим для правильной работы. Другие разработчики, похоже, заинтересованы в использовании прокси-сервера, написанного на C#, в качестве решения.