【问题标题】:Ruby on Rails posting to an API using javascript via a proxyRuby on Rails 通过代理使用 javascript 发布到 API
【发布时间】:2015-09-01 00:58:35
【问题描述】:

我对 Ruby on Rails 非常陌生,我希望这将是一个快速的解决方案。我有一个非常简单的表单(名字、姓氏、电子邮件),需要将 XML 发布到另一个域上的 API。我们网站上的所有内容都是客户端 javascript,因此我想发布到我们的 Rails 应用程序中的代理以解决跨域问题。

我找到了这段代码,它似乎在做我想做的事 - https://github.com/bitzesty/xml2jsonp 但我不知道如何以及在我们的 Ruby 应用程序中安装它的位置,以便我可以发布到它并接收响应。

任何帮助将不胜感激。

【问题讨论】:

  • 为什么不使用标准的 POST 请求将表单提交到 Rails 应用程序,然后让 Rails 为您将 XML 请求发送到远程 API?

标签: javascript ruby-on-rails ruby xml api


【解决方案1】:

Net::HTTP 是 Ruby 内置的用于发送 HTTP 请求的库。 Rails 还内置了将模型序列化为 XML 的功能。

假设您将表单绑定到 User 模型:

class User < ActiveModel::Base
  # attr_accessor is not needed if these are real DB columns.
  attr_accessor :firstname
  attr_accessor :surname
  attr_accessor :email
end

并处理UsersController#create中的表单

def UsersController < ApplicationController
  # POST `/users`
  def create
    @user = User.new(user_params)
    # @todo send user to remote service.
  end

  def user_params
    params.require(:user).permit(:firstname, :surname, :email)
  end
end

然后我们可以创建一个将用户发布到远程 API 的服务对象

# app/services/user_posting_service
class UserPostingService

  attr_accessor :user
  attr_accessor :client

  # Passing in the client lets us easily stub Net::HTTP in tests
  def initialize(user, client = Net::HTTP)
    @user = user
    @client = client
  end

  def call
    uri = URI('http://www.example.com/user.cgi')
    req = Net::HTTP::Post.new(uri)
    # see http://apidock.com/rails/ActiveRecord/Serialization/to_xml for options.
    req.body = @user.to_xml 

    res = Net::HTTP.start(uri.hostname, uri.port) do |http|
      http.request(req)
    end

    case res
    when Net::HTTPSuccess, Net::HTTPRedirection
      true
    else
      false
    end
  end
end

然后我们可以在控制器中使用该服务:

def UsersController < ApplicationController
  # POST `/users`
  def create
    @user = User.new(user_params)
    @posted = UserPostingService.new(@user).call
    if @posted
      # ... 
    else
       # ... 
    end
  end
  # ...
end

为简洁起见,有几个步骤未包括在内:

  • 您需要为users#create 创建路由
  • 如果您想使用 ajax 发布表单,您需要在 javascript 中设置一个处理程序。您还应该设置控制器以响应 JSON。
  • 您可能需要根据外部 API 设置 content-type 和其他标头。
  • 您可能需要对外部 API 的请求进行身份验证。

这两个都是非常基本的 Rails 技能,如果您不知道如何完成它,您应该先学习教程或阅读一本书,然后再尝试更高级的任务。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
相关资源
最近更新 更多