Взаимодействие с сторонним API в Rails? (URL-адреса Opeing и анализ XML/JSON)
Я работаю над проектом Rails, который должен взаимодействовать с несколькими сторонними API. Я новичок в Rails, и я никогда раньше этого не делал, поэтому здесь мне не хватает базовой информации. В частности, Какой предпочтительный способ Rails просто запрашивать внешний URL?
В мире PHP это было cURL. Вы берете любой URL ресурса, бросаете cURL на нем и начинаете обработку ответа, будь то XML, JSON и т.д.
Итак, что эквивалентно cURL в Rails? Пока мы на нем, , что является предпочтительным методом анализа XML и ответов JSON? Мои инстинкты для Google для некоторых камней Ruby, чтобы выполнить эту работу, но это такая практическая проблема, что я не удивлюсь, если сообщество Rails уже разработало проверенное решение этой проблемы.
Если он имеет какое-либо контекстуальное значение, я планирую запустить эти сторонние взаимодействия с API как ночные cronjobs, возможно, все они упакованы как пользовательские задачи rake.
Спасибо, что поделились своими знаниями.
Ответы
Ответ 1
для открытия URL-адресов вы можете использовать open-uri
просто
require 'open-uri'
file_handle = open("http://google.com/blah.xml")
для разбора xml вы можете использовать Nokogiri
$ gem install nokogiri
document = Nokogiri::XML(file_handle)
document/"xpath/search"
очень мощная библиотека, может выполнять все виды поиска и изменения как для XML, так и для HTML
для html Nokogiri::HTML
там также много поддержки JSOM.
checkout Nokogiri также Hpricot хорош для XML/HTML
для JSON в рельсах
parsed_json = ActiveSupport::JSON.decode(your_json_string)
parsed_json["results"].each do |longUrl, convertedUrl|
site = Site.find_by_long_url(longUrl)
site.short_url = convertedUrl["shortUrl"]
site.save
end
см. этот вопрос:
Как разобрать JSON с Ruby on Rails?
Ответ 2
В идеальном мире, камень уже существует для API, который вы хотите использовать, и вы просто использовали бы это. В противном случае у вас есть несколько вариантов:
Разбор JSON, как правило, очень прост. Для XML, как указано в другом ответе, Nokogiri, вероятно, путь.