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 技能,如果您不知道如何完成它,您应该先学习教程或阅读一本书,然后再尝试更高级的任务。