Ruby on Rails通过代理使用javascript发布到API

时间:2015-06-16 09:27:09

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

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

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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

让我们假设您将表单绑定到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

中的表单
# 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

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

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

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

  • 您需要为html { width:120x; margin-left:0px; }
  • 创建路线
  • 如果您想使用ajax发布表单,则需要在javascript中设置处理程序。您还应该设置控制器以使用JSON进行响应。
  • 您可能需要根据外部API设置内容类型和其他标头。
  • 您可能需要对外部API的请求进行身份验证。

这些都是非常基本的Rails技能,如果你不知道如何完成它,你应该在尝试更高级的任务之前先阅读教程或阅读一本书。