Подключение к веб-сервисам с помощью Rails (HTTP-запросы)? - PullRequest
6 голосов
/ 18 февраля 2011

Я использую Ruby on Rails 3 и пытаюсь реализовать API для получения информации об учетной записи из веб-службы. То есть я хотел бы подключиться к веб-службе с классом Account и получить информацию от действия show, направленного по URI http://<site_name>/accounts/1.

На данный момент в веб-сервисе accounts_controller.rb файл у меня есть:

class AccountsController < ApplicationController
  def show
    @account = Account.find(params[:id])

    respond_to do |format|
      format.html
      format.js
      format.json { render :json => @account.to_json }
    end
  end
end

Теперь мне нужен совет по подключению к веб-сервису. В клиентском приложении у меня должен быть запрос HTTP GET, но вот мой вопрос: каков «лучший» подход для подключения к веб-службе, выполняющей запросы HTTP?

Этот код в клиентском приложении работает:

url = URI.parse('http://<site_name>/accounts/1.json')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) {|http|
  http.request(req)
}

@output = JSON(res.body)["account"]

но является ли приведенный выше код "способом" реализации API?

Желательно ли использовать сторонние плагины и гемы?

Ответы [ 6 ]

4 голосов
/ 18 февраля 2011

Да, так как вы используете RESTful маршруты, они являются вашим основным API. Вы также возвращаете структурированные данные JSON, легко используемые приложением.

Существуют и другие способы реализации API веб-служб (например, SOAP ), но это хороший и правильный способ.

Поскольку это API-интерфейс веб-служб, подключение к правильному URL-адресу и разбор ответа - это путь на стороне клиента. Хотя, если вам нужно получить доступ ко многим различным ресурсам, было бы неплохо создать гибкий способ создания URL-адреса запроса.

3 голосов
/ 18 февраля 2011

Если вам не нужна низкоуровневая возможность настройки, предлагаемая Net :: HTTP, вместо этого посмотрите на Open-URI , который поставляется с Ruby. Это позволяет легко запросить страницу и получить тело обратно. Open-URI не имеет всех наворотов, но во многом из того, что я делаю, очень хорошо.

Простое использование выглядит как:

require 'open-uri'
body = open('http://www.example.com').read

В документах есть много других примеров.

Мне нравятся другие HTTP-клиенты:

Они более настраиваемы и могут обрабатывать несколько соединений одновременно, если это то, что вам нужно. Например, в Typhoeus есть набор упрощенных вызовов, похожих на Open-URI. Из документов:

response = Typhoeus::Request.get("http://www.pauldix.net")
response = Typhoeus::Request.head("http://www.pauldix.net")
response = Typhoeus::Request.put("http://localhost:3000/posts/1", :body => "whoo, a body")
response = Typhoeus::Request.post("http://localhost:3000/posts", :params => {:title => "test post", :content => "this is my test"})
response = Typhoeus::Request.delete("http://localhost:3000/posts/1")

HTTPClient имеет аналогичные сокращенные методы тоже.

2 голосов
/ 18 февраля 2011

Я бы рекомендовал использовать Rails ' ActiveResource для большинства случаев. В противном случае httparty .

1 голос
/ 27 декабря 2013

rest-client - самый популярный гем для простого подключения к веб-сервисам RESTful

1 голос
/ 27 июня 2012

Я бы использовал ActiveResource, если вам нужен простой способ получить ресурсы, основанные на отдыхе.Он уже включен в рельсы и довольно прост в настройке.Вы просто указываете базовый URL и имя ресурса в своем подклассе ActiveResource, а затем можете использовать ресурсы CRUD для отдыха, используя интерфейс, аналогичный интерфейсу ActiveRecord.

0 голосов
/ 07 марта 2017

Я думаю, что одним из лучших решений является Ее драгоценный камень . Он инкапсулирует спокойные запросы, предоставляя объектам поведение с активной записью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...