Удаленный запрос getJSON без JSONP — сервер

Я пытаюсь вызвать JSON-данные с удаленного сервера, но сервер не возвращает действительные сформированные данные JSONP, а только действительные данные JSON. (подтверждено валидаторами)

Если я делаю запрос getJSON (с &callback=?), я получаю действительный возвращенный JSON, но он не запускает функцию обратного вызова, потому что это недействительный JSONP.

Есть ли хороший способ получить доступ к возвращенным данным JSON?


person Tim    schedule 23.11.2010    source источник
comment
Вы управляете удаленным сервером? Вы не можете вызвать удаленный сервер через свой серверный скрипт?   -  person Philar    schedule 23.11.2010
comment
Если вы также можете указать URL-адрес удаленного сервера   -  person Philar    schedule 23.11.2010
comment
я уверен, что если мне разрешено упоминать об этом, так что лучше не надо. И доступа к серверу у меня тоже нет, только к данным JSON.   -  person Tim    schedule 23.11.2010


Ответы (3)


Нет, это должны быть данные JSONP из-за того, как все это работает, в основном это включает файл JavaScript путем создания тега <script>... и этот ответ должен быть действительным JavaScript, литерал объекта (сам по себе) недействителен JavaScript.

Подумайте об этом с другой стороны: если бы мы могли получить JSON с удаленного сервера, зачем тогда существовал бы JSONP? :)

person Nick Craver    schedule 23.11.2010
comment
хорошо, если это не работает, мне, возможно, придется использовать php, чтобы получить данные JSON и передать их в js. Хотел этого избежать, но, похоже, это единственный способ в данном случае. - person Tim; 23.11.2010
comment
@Tim - да, прокси-сервер - единственная другая альтернатива, если они не поддерживают JSONP, убедитесь, что они не используют другой формат для указания обратного вызова, хотя некоторые используют jsonpcallback= или jsoncallback= или совершенно другой формат URL. - person Nick Craver; 23.11.2010

Да, это отстой. У меня такая же проблема с API Viddler (на стороне браузера). Он отправляет данные JSON обратно, но не в скриптовом интерфейсе JSON-P.

Таким образом, у вас есть два варианта:

  1. Как говорили люди, используйте внутренний прокси-сервер для выполнения запросов на стороне сервера.
  2. Если вам нужно поддерживать только один браузер (в моем случае Chromium), используйте что-то вроде "chromium-browser --disable-web-security", чтобы отключить правило "same-origin-policy". Это позволит вам делать междоменные запросы, но только для этой конкретной ситуации.

Удачи чувак!

person Cheng Chen    schedule 08.05.2011

Ну, во-первых, если ваш сервер, с которого вы получаете JSON, не поддерживает JSONP, вам придется использовать прокси. Если он поддерживает JSONP, вы должны немного отформатировать свой запрос, как в примере ниже. Если вы не укажете обратный вызов в $.getJSON(...&callback=?), тогда ваш запрос будет выглядеть так:

http://someurl?callback=123489234982

с каким-то нелепым числом на конце, и это делает вашу жизнь мучительной. Итак, вы должны указать обратный вызов и отформатировать свой код следующим образом:

<script>
     $.getJSON("your url?callback=callbackName", ....);

     function callbackName { do what you want with the json in here }
</script>

если это не сработает, значит, ваш сервер не поддерживает JSONP :( вот ссылка на прокси-сервер php, который вы могли бы использовать, он довольно хорош и имеет много документации.

http://benalman.com/projects/php-simple-proxy/

person Matt    schedule 25.11.2010