HTTParty.get с обратным вызовом вызывает MultiJson::DecodeError.

Я использую HTTParty для вызовов API. Когда у меня есть обратный вызов в URL-адресе, он вызывает MultiJson::DecodeError:

MultiJson::DecodeError in PagesController#home

756: unexpected token at '12345({"label":"daydata","data":[[1335484800883,69586],
[1335571201001,17725]]});

Мой вызов get выглядит так:

@data = HTTParty.get("http://powermeters.appspot.com/getdays?id=1234567890&from=2012-04-24&to=2012-04-29&callback=12345")

Кто-нибудь знает, что вызывает это, и как это решить?


person Anders    schedule 07.05.2012    source источник


Ответы (2)


Проблема в том, что ответ - это javascript, а не JSON. Чтобы исправить это, вы можете сделать:

response.gsub! /^\d+\((.*)\);?$/m, '\\1'

или что-то подобное.

person pguardiario    schedule 07.05.2012
comment
Да, похоже на службу JSONP, где вы указываете обратный вызов для выполнения на своем собственном веб-сайте через тег <script> либо явно, либо через какую-то клиентскую библиотеку. - person d11wtq; 07.05.2012
comment
@d11wtq Мм, хорошо. Можно ли получить запрос в контроллере Rails, я делаю некоторые дополнительные вычисления с данными. Или мне нужно получить его из Javascript, а затем передать его моему контроллеру, и как будет выглядеть такой сценарий? Спасибо. - person Anders; 07.05.2012
comment
Вы пробовали предложение @pguardiario просто убрать вызов функции, который обернут вокруг него? - person d11wtq; 07.05.2012
comment
@ d11wtq Да, я пытался, но у меня не получилось. Приложение, кажется, падает, как только я делаю запрос на получение с помощью HTTparty, поэтому я не знаю, получу ли я ответ на gsub!. Вы знаете, где я должен положить его? - person Anders; 08.05.2012
comment
Наконец-то я заставил его работать, используя ответ @pguardiario и изменив HTTParty на Net:HTTP.get_response, начиная с: stackoverflow.com/questions/9917666/. Спасибо! - person Anders; 08.05.2012

Вы также можете переопределить парсер. Простой пример ниже.

if MultiJson... вытягивается прямо из парсера JSON HTTParty.

class Foo
  include HTTParty
  base_uri "http://foo.bar"

  parser lambda { |body,_|
    new_body = body.gsub(/^\d+\((.*)\)$/, '\1')
    if MultiJson.respond_to?(:adapter)
      MultiJson.load(new_body)
    else
      MultiJson.decode(new_body)
    end
  }
end
person Daniel Evans    schedule 12.06.2013