Как я могу использовать $.ajax для извлечения обычного JSON как JSONP?

#jquery #ajax #json #jsonp #cross-domain-policy

#jquery #ajax #json #jsonp #междоменная политика

Вопрос:

У меня есть обычный канал JSON, который я опрашиваю по URL (normalJSONfeed). Я получаю cross origin policy error каждый раз. Как я могу изменить $.ajax функцию, чтобы обойти это ограничение, когда у меня нет никакого способа изменить канал JSON (другими словами, я не могу обернуть канал JSON в вызов функции).

 $.ajax({
    type : "GET",
    dataType : "jsonp",
    url : '/normalJSONfeed',
    data : {}
    success: function(obj){

    }
});
 

Комментарии:

1. Вы не можете, сервер должен фактически отправлять JSONP, вы ничего не можете сделать, чтобы изменить данные на стороне клиента. Вы могли бы использовать свой собственный сервер в качестве прокси-сервера, хотя!

2. AFAIK, cross origin не имеет никакого отношения к JSON против VSONP. Это просто означает, что вы пытаетесь запросить URL-адрес, который не находится на том же сервере (протокол домен порт), что и страница, с которой он вызывается.

3. @jcaron: Это именно то, для чего используется JSONP.

Ответ №1:

В коде нет ничего, что вы могли бы изменить, только то, что позволяет запрашивать JSON как JSONP. Поскольку запросы JSONP используют тег script для запроса данных, между загружаемыми и обрабатываемыми данными нет точки, на которую вы можете повлиять.

Если вы не можете изменить то, что отправляет сервер, вам нужен промежуточный сервер, который может изменить ответ до его поступления. Я настроил прокси-сервер, который изменяет ответ JSON на ответ JSONP. Запросите страницу прокси и отправьте URL-адрес ресурса, который возвращает JSON в качестве параметра.

Пример:

 $.ajax({
    dataType : "jsonp",
    url : 'http://jsonp.guffa.com/Proxy.ashx?url='   encodeURIComponent('www.someserver.com/normalJSONfeed'),
    success: function(obj){

    }
});
 

Комментарии:

1. Блестяще. И я предполагаю, что могу полагаться на ваш прокси-сервер вечно ;)? Нет, серьезно, можно? Кроме того, есть ли какой-либо другой хак или метод, который можно использовать на стороне браузера , чтобы обойти эту политику?

2. @Startec: Я настроил сервер в основном для целей тестирования, но я не планирую его отключать. Вы ничего не можете сделать в браузере, чтобы обойти ту же политику происхождения. Чтобы обойти это, вам нужно, по крайней мере, иметь возможность добавлять файлы на сервер.

3. Я понимаю. Было ли сложно настроить ваш прокси-сервер? Очень хотелось бы знать, как это делается!

4. @Startec: Принцип прост, это просто страница, которая выполняет запрос и возвращает ответ после обертывания его в коде для вызова функции, но получить заголовки и все правильно было немного сложно.