рельсы, отвечающие на запрос междоменной разработки локально, разработка приложений Spotify

Итак, я возился с разработкой приложения Spotify, пытаясь заставить его общаться с моим локальным API приложения rails. Я не могу получить ничего, кроме req.status 0, когда пытаюсь это сделать.

Я думаю, что это либо проблема с файлом Spotify manifest.json, не позволяющим порту: 3000 переходить по URL-адресу, который вы указали в необходимых разрешениях, но в их документации также говорится следующее.

https://developer.spotify.com/technologies/apps/tutorial/

Если вам нужно обратиться к внешнему веб-API, вы можете это сделать, если вы соблюдаете правила, установленные в Руководстве по интеграции. Обратите внимание, что при взаимодействии с веб-API запросы будут исходить из источника sp://$APPNAME (в нашем примере это sp://tutorial) — убедитесь, что служба, с которой вы общаетесь, принимает запросы из такого источника.

Итак, я не уверен, настроены ли рельсы, чтобы не допускать такого рода вещи, или это проблема с помещением порта в требуемые разрешения, но мой запрос

  var req = new XMLHttpRequest();
  req.open("GET", "http://127.0.0.1:3000/api/spotify/track/1.json", true);
  console.log(req);
  req.onreadystatechange = function() {

  console.log(req.status);
  console.log(req.readyState);
  if (req.readyState == 4) {
    if (req.status == 200) {
       console.log("Search complete!");
       console.log(req.responseText);
    }
    }
};

req.send();

Всегда возвращает статус 0, где в качестве примера:

var req = new XMLHttpRequest();
req.open("GET", "http://ws.audioscrobbler.com/2.0/?method=geo.getevents&location=" + city + "&api_key=YOUR_KEY_HERE", true);

req.onreadystatechange = function() {

    console.log(req.status);

    if (req.readyState == 4) {
      console.log(req);           
        if (req.status == 200) {
            console.log("Search complete!");
            console.log(req.responseText);
        }
    }
};

req.send();

По крайней мере, вернет ответ 403. как будто запрос не выполняется или что-то в этом роде?

Кто-нибудь знает, что может происходить?

Очень признателен!


person thrice801    schedule 04.08.2012    source источник
comment
Проверьте, не попало ли ваше приложение rails в ваши журналы.   -  person Anthony Alberto    schedule 04.08.2012
comment
Просто чтобы было понятно, откуда запрос? 127.0.0.1:3000 допустимо только с вашего локального компьютера!   -  person Anthony Alberto    schedule 04.08.2012
comment
Да, это происходит из самого приложения Spotify, у меня есть собственная маленькая консоль с приложением Spotify, насколько я могу судить, она запускается в контексте моей локальной машины. - также я только что попытался зайти на домашнюю страницу одного из моих живых сайтов, чтобы посмотреть, смогу ли я получить что-нибудь, кроме пустого ответа, и я не смог, получил то же самое. Так что я думаю, что это может быть настройка сервера или что-то в этом роде? Хмммм.   -  person thrice801    schedule 04.08.2012
comment
Попробуйте использовать веб-инспектор, такой как firebug или chrome dev tools, чтобы убедиться, что запрос отправлен из вашего браузера (найдите вкладку сети)   -  person Anthony Alberto    schedule 04.08.2012


Ответы (2)


При обращении к внешним службам из приложения Spotify, даже если они работают на вашем локальном компьютере, вам необходимо убедиться, что две вещи выполнены правильно:

  • URL-адрес (или, по крайней мере, хост) находится в разделе RequiredPermissions вашего манифеста. Порт не имеет значения. http://127.0.0.1 должно подойти для вашего случая.

  • Сервер разрешает источник sp://your-app-id для запросов, как указано в документации, которую вы вставили в свой вопрос. Это делается путем установки заголовка Access-Control-Allow-Origin в HTTP-ответе вашей службы. Люди часто устанавливают его на Access-Control-Allow-Origin: *, чтобы разрешить кому угодно делать запросы к их службе.

person iKenndac    schedule 04.08.2012

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

Во-первых, мне пришлось запускать rails на порту 80, поскольку, очевидно, если я захожу на свой сайт с 127.0.0.1:3000, это не сработает, если приложение Spotify запрашивает 127.0.0.1, если я не могу загрузить это прямо в браузере, что вы не можете, если не работаете на 80. Это делается через

rvmsudo rails server -p 80

Необходимо использовать rvmsudo, потому что для изменения порта требуются разрешения.

Затем мне нужно было установить источник контроля доступа, как указано выше, что можно сделать в rails 3, добавив фильтр перед вашим контроллером приложения следующим образом.

class ApplicationController < ActionController::Base

  logger.info "I SEE REQUEST"

  before_filter :cor

  def cor
    headers["Access-Control-Allow-Origin"] = "*"
    headers["Access-Control-Allow-Methods"] = %w{GET POST PUT DELETE}.join(",")
    headers["Access-Control-Allow-Headers"] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(",")
    head(:ok) if request.request_method == "OPTIONS"
  end
end

Наконец, и самое главное (вздох), вы не можете просто щелкнуть правой кнопкой мыши и перезагрузить приложение Spotify, когда вносите изменения в файл манифеста, полностью выходите из Spotify и перезапускаете его!

person thrice801    schedule 04.08.2012