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
然後,我們可以使用我們的服務troller:
def UsersController < ApplicationController
# POST `/users`
def create
@user = User.new(user_params)
@posted = UserPostingService.new(@user).call
if @posted
# ...
else
# ...
end
end
# ...
end
有沒有包括爲簡潔幾個步驟:
- 你需要的,如果你想發佈使用Ajax,你需要安裝一個形式創造
users#create
- 路線JavaScript中的處理程序。您還應該設置控制器以使用JSON進行響應。
- 您可能需要根據外部API設置內容類型和其他標頭。
- 您可能需要驗證對外部API的請求。
這兩個都是非常基本的Rails技能,如果你不知道如何完成它,你應該在嘗試更高級的任務之前按照教程或者讀一本書。
來源
2015-06-16 12:00:43
max
爲什麼不使用標準的POST請求將表單提交給Rails應用程序,並讓rails將XML請求發送給遠程API? – Jon