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

xnobis 发布于 5 天前 api 最后更新 5 天前 0 浏览

我对Ruby on Rails非常陌生,我希望这将是一个快速的解决方案。我有一个非常简单的表单(名字,姓氏,电子邮件),需要将XML发布到另一个域上的API。我们网站上的所有内容都是客户端JavaScript,因此我想在我们的Rails应用程序中发布到代理以解决跨域问题。 我发现了这么一小段代码,它似乎正在做我想做的事 - https://github.com/bitzesty/xml2jsonp,但我不知道如何以及在哪里安装这个在我们的Ruby应用程序,所以我可以发布到它并接收响应。 任何帮助,将不胜感激。

已邀请:

quia_a

赞同来自:

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设置内容类型和其他标头。
  • 您可能需要对外部API的请求进行身份验证。
这些都是非常基本的Rails技能,如果你不知道如何完成它,你应该在尝试更高级的任务之前遵循教程或阅读书籍。