如何在 Rails 应用程序中使用 Savon 使用 SOAP
How to Consume SOAP with Savon in Rails app
我需要在我正在开发的 Rails 应用程序上使用 Savon 通过 Soap 与名为 ifthenpay 的服务进行通信。
该服务生成付款参考,以便用户可以在家庭银行或自动提款机上付款。
应用程序需要与服务通信以查看是否已付款。
我正在使用 Savon,这是我目前在结帐模型中所拥有的(不知道这是否是放置上述代码的正确位置):
def self.check_status!
client = Savon.client(
wsdl: "http://www.ifthensoftware.com/IfmbWS/IfmbWS.asmx?WSDL",
endpoint: "http://localhost:3000",
namespaces: {"xmlns:ift"=>"https://www.ifthensoftware.com/"}
)
begin
response = client.call(:get_payments, message: check_status_hash)
rescue Savon::SOAPFault => error
#...
end
end
def self.check_status_hash
{
"ift:get_payments" => {
"ift:chavebackoffice" => { "ift:chavebackoffice" => "0000-0000-0000-0000" },
"ift:entidade" => {"ift:entidade" => "11202"},
"ift:subidentidade" => {"ift:subidentidade" => "202"},
"ift:dtHrInicio" => {"ift:dtHrInicio" => ""},
"ift:dtHrFim" => {"ift:dtHrFim" => ""},
"ift:referencia" => {"ift:referencia" => ""},
"ift:valor" => {"ift:valor" => ""}
}
}
end
我有一个管理页面,我需要在其中列出所有已支付的款项,以便我可以管理已售出的商品。
可以看到服务操作here
我需要在控制器和视图中放入什么才能使其工作?
非常感谢您的帮助,因为我为此苦苦挣扎了很长时间。
从我的角度来看,请原谅我,因为我对 savon
的使用不是很有经验,你有点矫枉过正了。
首先,您向客户提供了一个 WSDL
url,那么附加一个可疑的必要 endpoint
有什么用?
据我所知,namespace
是必需的,以防没有标准的 WSDl
界面。
我会去,首先,我会去:
@client = Savon.client(wsdl: "http://www.ifthensoftware.com/IfmbWS/IfmbWS.asmx?WSDL")
观看 @client
而不是 client
。我们需要将客户端分配给一个在整个过程(请求、过程、响应)中都可以访问的变量。
接下来,您需要准备您的请求。解析上面的url,有一堆方法。您在示例中提供 getPayments
请求。
我不会用这个 space 来告诉你如何构造散列,但散列应该看起来像这样:
request_hash = {
chavebackoffice: "0000-0000-0000-0000",
entidade: "11202",
subidentidade: "202",
dtHrInicio: "",
dtHrFim: "",
referencia: "",
valor: ""
}
要调用 api,您只需这样做:
@response = @client.call(:get_payments) do
message request_hash
end
然后,解析@response。您可能需要先将其转换为哈希。也许是这样的:
@data = @response.to_hash[:get_payments_response][:get_payments_result][:ifmb]
希望以上内容对您有所帮助。应该绰绰有余了。
全部放上:controller代码,适合自己的需要
before_action :set_client, only: [:get_payments, :other_actions_perhaps]
def get_payments
# params[:whatever] in case you post to @whatever object
# params without [:whatever] if you are using "GET" method
request_hash = {
chavebackoffice: params[:whatever][:chavebackoffice],
entidade: params[:whatever][:entidade],
subidentidade: params[:whatever][:subidentidade],
dtHrInicio: params[:whatever][:dtHrInicio],
dtHrFim: params[:whatever][:dtHrFim],
referencia: params[:whatever][:referencia],
valor: params[:whatever][:valor]
}
response = @client.call(:get_payments) do
message request_hash
end
# use this @data in your view
@data = response.to_hash[:get_payments_response][:get_payments_result][:ifmb]
end
def set_client
@client = Savon.client(wsdl: "http://www.ifthensoftware.com/IfmbWS/IfmbWS.asmx?WSDL")
end
我需要在我正在开发的 Rails 应用程序上使用 Savon 通过 Soap 与名为 ifthenpay 的服务进行通信。
该服务生成付款参考,以便用户可以在家庭银行或自动提款机上付款。
应用程序需要与服务通信以查看是否已付款。
我正在使用 Savon,这是我目前在结帐模型中所拥有的(不知道这是否是放置上述代码的正确位置):
def self.check_status!
client = Savon.client(
wsdl: "http://www.ifthensoftware.com/IfmbWS/IfmbWS.asmx?WSDL",
endpoint: "http://localhost:3000",
namespaces: {"xmlns:ift"=>"https://www.ifthensoftware.com/"}
)
begin
response = client.call(:get_payments, message: check_status_hash)
rescue Savon::SOAPFault => error
#...
end
end
def self.check_status_hash
{
"ift:get_payments" => {
"ift:chavebackoffice" => { "ift:chavebackoffice" => "0000-0000-0000-0000" },
"ift:entidade" => {"ift:entidade" => "11202"},
"ift:subidentidade" => {"ift:subidentidade" => "202"},
"ift:dtHrInicio" => {"ift:dtHrInicio" => ""},
"ift:dtHrFim" => {"ift:dtHrFim" => ""},
"ift:referencia" => {"ift:referencia" => ""},
"ift:valor" => {"ift:valor" => ""}
}
}
end
我有一个管理页面,我需要在其中列出所有已支付的款项,以便我可以管理已售出的商品。
可以看到服务操作here
我需要在控制器和视图中放入什么才能使其工作?
非常感谢您的帮助,因为我为此苦苦挣扎了很长时间。
从我的角度来看,请原谅我,因为我对 savon
的使用不是很有经验,你有点矫枉过正了。
首先,您向客户提供了一个 WSDL
url,那么附加一个可疑的必要 endpoint
有什么用?
据我所知,namespace
是必需的,以防没有标准的 WSDl
界面。
我会去,首先,我会去:
@client = Savon.client(wsdl: "http://www.ifthensoftware.com/IfmbWS/IfmbWS.asmx?WSDL")
观看 @client
而不是 client
。我们需要将客户端分配给一个在整个过程(请求、过程、响应)中都可以访问的变量。
接下来,您需要准备您的请求。解析上面的url,有一堆方法。您在示例中提供 getPayments
请求。
我不会用这个 space 来告诉你如何构造散列,但散列应该看起来像这样:
request_hash = {
chavebackoffice: "0000-0000-0000-0000",
entidade: "11202",
subidentidade: "202",
dtHrInicio: "",
dtHrFim: "",
referencia: "",
valor: ""
}
要调用 api,您只需这样做:
@response = @client.call(:get_payments) do
message request_hash
end
然后,解析@response。您可能需要先将其转换为哈希。也许是这样的:
@data = @response.to_hash[:get_payments_response][:get_payments_result][:ifmb]
希望以上内容对您有所帮助。应该绰绰有余了。
全部放上:controller代码,适合自己的需要
before_action :set_client, only: [:get_payments, :other_actions_perhaps]
def get_payments
# params[:whatever] in case you post to @whatever object
# params without [:whatever] if you are using "GET" method
request_hash = {
chavebackoffice: params[:whatever][:chavebackoffice],
entidade: params[:whatever][:entidade],
subidentidade: params[:whatever][:subidentidade],
dtHrInicio: params[:whatever][:dtHrInicio],
dtHrFim: params[:whatever][:dtHrFim],
referencia: params[:whatever][:referencia],
valor: params[:whatever][:valor]
}
response = @client.call(:get_payments) do
message request_hash
end
# use this @data in your view
@data = response.to_hash[:get_payments_response][:get_payments_result][:ifmb]
end
def set_client
@client = Savon.client(wsdl: "http://www.ifthensoftware.com/IfmbWS/IfmbWS.asmx?WSDL")
end