Jquery кросс-доменный запрос ajax всегда ошибка

Я пытаюсь создать простое мобильное приложение Jquery. Моя установка выглядит следующим образом:

  1. Клиент jQuery работает на localhost:9090/myapp.
  2. Мой сервер работает на localhost:9010/paperboy
  3. Поскольку я работаю в Windows, на стороне сервера я использую простой сервер, созданный с использованием «bottle», который представляет собой микрофреймворк Python.
  4. Сервер возвращает json по запросу, что я ясно вижу в Chrome или Firefox.
  5. Я проверил свой ответ, и это действительный JSON.

Проблема, с которой я столкнулся, заключается в том, что я хочу, чтобы мой клиент читал json из ответа сервера.
Но, поскольку это междоменная проблема, он не может этого сделать.
Вот мой код ajax для клиент:

$.ajax({
        url: "http://localhost:9010/paperboy/toi",
        type:"GET",
        data:$(this),
        dataType:"jsonp",
        //jsonp:"callback",   no support on the server

        success:function(result){
            console.log("ajax result: " + result);
        },

        error:function(e){
            console.log("Error :" + e);
        }
    });

и мой код сервера бутылки:

from bottle import route, run, template, response
from paperboy import getToiNews

''' call http://localhost:9010/paperboy/toi in browser'''

@route('/paperboy/:source')
def index(source='All'):
    print "requesting news list for %s" % source
    resultJson = getToiNews()
    response.content_type = "application/javascript"
    return resultJson

run(host='localhost', port=9010)

Однако при запуске приложения я изначально получал «ошибку политики происхождения ajax», которая вскоре исчезла, как только я добавил тип контента на свой сервер.
Теперь вызов ajax проходит без ошибок, но всегда вызывает обработчик «ошибки». . Пробовал разные комбинации, но все тщетно. Одна вещь, которую я не мог понять, это добавление поддержки jsonp на мой сервер.
Я ценю любую помощь в этом вопросе и заранее благодарю вас за всю помощь.
Спасибо.


person ashish.gd    schedule 13.02.2013    source источник
comment
Я также попытался установить тип контента как application/json с сервера.   -  person ashish.gd    schedule 13.02.2013


Ответы (1)


Вы сами это сказали, поскольку это вызов из другого источника, по умолчанию он запрещен SOP.

Если вы контролируете сервер (а это так), вы можете использовать CORS разрешить запрос. Это будет работать в любом современном браузере. (Хотя, к сожалению, в случае IE8 и IE9 вам понадобится патч jQuery, чтобы разрешить использование специфичного для Microsoft объекта XDomainRequest, а не стандартного XMLHttpRequest; команда jQuery отказывается помещать его в библиотеку. IE10, наконец, добавляет кросс- обработка домена до XMLHttpRequest.)

В качестве альтернативы, поскольку ответ представляет собой JSON, вместо этого вы можете использовать очень похожий JSON-P, который имеет преимущество работы со всеми браузерами (и без патчей jQuery).

person T.J. Crowder    schedule 13.02.2013
comment
Блестяще!!! Большое спасибо Вам. Оно работало завораживающе. Все, что мне нужно было сделать, это установить свойство заголовка. На самом деле он присутствует в документах по бутылкам с использованием плагина hooks. Плохо, что я посмотрел на это. - person ashish.gd; 13.02.2013
comment
@ashish.gd: Рад, что помог! - person T.J. Crowder; 13.02.2013