我对Ruby on Rails非常陌生,我希望这将是一个快速解决方案。我有一个非常简单的表单(名字,姓氏,电子邮件),需要将XML发布到另一个域的API。我们网站上的所有内容都是客户端javascript,所以我想在我们的Rails应用程序中发布代理来克服跨域问题。
我找到了这段代码,似乎正在做我想做的事情 - https://github.com/bitzesty/xml2jsonp但是我不知道在我们的Ruby应用程序中如何以及在哪里安装它,所以我可以发布它并接收响应。
任何帮助都将不胜感激。
答案 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;
}
这些都是非常基本的Rails技能,如果你不知道如何完成它,你应该在尝试更高级的任务之前先阅读教程或阅读一本书。