2015-10-05 2 views
1

Я пытаюсь сделать кросс-доменный асинхронный запрос GET через ajax jQuery, и я получаю много проблем, понимая, что происходит, и сообщения об ошибках веб-браузеров.Может ли кто-нибудь помочь мне понять асинхронный JS-запрос crossdomain и как его отладить?

Во-первых, вот код CoffeeScript:

$(document).on('submit', '.myform', (e) -> 
    try 
     foo = 'val'     
     settings = 
      data: { foo: foo } 
      type: 'GET' 
      dataType: 'json' 
      success: (data, textStatus, jqXHR) -> 
       console.log data if debug? 
       console.log textStatus if debug? 
      error: (jqXHR, textStatus, errorThrown) -> 
       console.warn textStatus if debug? 
       console.warn errorThrown if debug? 

     $.ajax('http://anotherserver.tld/api', settings) 
    catch error 
     console.error error 
    finally 
     return false 
) 

я понял, что json имеет тип а действительные данные, только если вы настроите перекрестную файл домена на хосте, обслуживающей JavaScript. Вот один я (назовём сервер my_server.tld):

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <!-- Read this: https://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html --> 

    <!-- Most restrictive policy: --> 
    <!-- <site-control permitted-cross-domain-policies="none"/> --> 

    <!-- Least restrictive policy: --> 
    <site-control permitted-cross-domain-policies="all"/> 
    <allow-access-from domain="*" to-ports="*" secure="false"/> 
    <allow-http-request-headers-from domain="*" headers="*" secure="false"/> 
</cross-domain-policy> 

(это из HTML5 шаблонный)

Когда я пытаюсь этот код, я получаю следующее сообщение об ошибке:

[Error] XMLHttpRequest cannot load http://anotherserver.tld/api?foo=val. Origin http://my_server.tld is not allowed by Access-Control-Allow-Origin. 

Это меня смущает. Это что-то отсутствует или неисправная конфигурация на my_server или anotherserver? Имеются ли файлы crossdomain.xml, относящиеся к этим вопросам?

Причина, даже если у меня нет доступа к anotherserver.tld, я пробовал этот код, используя my_other_server, и я смог полностью увидеть запрос в журналах доступа my_other_server.

Благодарим за помощь.

(для записи, я попытался переключиться на jsonp, но затем я получаю ошибку синтаксического анализа на то, что выглядит как прекрасно данных JSON ... некоторые волосы были потеряны)

Update: это crossdomain.xml файл от anotherserver.tld:

<cross-domain-policy> 
<site-control permitted-cross-domain-policies="master-only"/> 
<allow-access-from domain="*"/> 
<allow-http-request-headers-from domain="*" headers="*"/> 
</cross-domain-policy> 
+0

http://stackoverflow.com/questions/10636611/how-does-access-control-allow-origin-header-work – rocky

+0

Ваш * сервер *, отправивший запрос на необходимость поддержки CORS ('Access- Control-Allow-Origin') или JSONP (который не является * JSON). Для работы CORS ваш сервер должен установить заголовок 'Access-Control-Allow-Origin'. Для JSONP ваш сервер должен вывести файл JavaScript. JSONP отформатирован так: 'callback ({your: data})'. –

+0

google эта ошибка ... есть даже целый сайт, посвященный этому – charlietfl

ответ

0

Ваш код jquery в порядке. Вам нужно будет проверить с владельцем ajax-сервера, если он разрешает междоменные запросы.

Невозможно сделать запросы ajax для перекрестных доменных серверов, если они не настроены для этого.

Подробнее об этом здесь: https://en.wikipedia.org/wiki/Cross-origin_resource_sharing


Concretley здесь, anotherserver.tld должен включать в себя заголовок Access-Control-Allow-Origin: my_server (или *) в своем ответе.