如何将PHP SoapClient请求示例转换为RoR实现?
将PHP SoapClient示例转换为Ruby on Rails代码及HTTP逻辑解析
嘿,我来帮你把这段PHP的SOAP请求转换成Ruby on Rails能用的代码,顺便把HTTP层面的核心逻辑给你讲清楚~
一、RoR代码实现(用Savon处理SOAP)
RoR里处理SOAP请求最常用的是savon这个gem,步骤很简单:
1. 先安装依赖
在你的Gemfile里添加:
gem 'savon'
然后运行bundle install完成安装。
2. 编写调用代码
你可以把这段代码放在控制器、服务类或者任何需要调用的地方:
require 'savon' # 初始化SOAP客户端,加载目标服务的WSDL client = Savon.client( wsdl: "https://secure.przelewy24.pl/external/wsdl/service.php?wsdl", # 可选配置:如果测试环境SSL验证有问题,可以临时关闭,生产环境建议开启 ssl_verify_mode: :none ) # 调用TestAccess方法,注意savon默认会把驼峰命名转成蛇形(TestAccess → test_access) response = client.call(:test_access, message: { # 参数名要对应WSDL定义,这里对应PHP里的两个参数 arg0: "999", arg1: "anuniquekeyretrievedfromprzelewy24" }) # 处理响应结果 if response.success? # 从响应XML里提取结果,路径要根据实际返回的结构调整 access_granted = response.body[:test_access_response][:test_access_result] puts access_granted ? "Access granted" : "Access denied" else puts "请求失败:#{response.errors.full_messages.join(', ')}" end
小提示:你可以通过client.operations查看这个SOAP服务所有可用的方法,通过client.operation(:test_access).document查看该方法的参数结构,避免参数名出错。
二、HTTP层面的TestAccess处理:别误解啦!
你说的“HTTP中没有方法概念”没错,但SOAP是基于HTTP的上层协议,它的“方法”(也就是SOAP操作)根本不需要拼到URL里,而是藏在请求体的XML内容中:
具体的HTTP请求细节:
- 请求URL:就是你提供的WSDL对应的服务端点(大部分情况下和WSDL地址一致,WSDL里会明确标注实际的请求地址)
- 请求方法:固定是
POST(几乎所有SOAP请求都是POST) - 请求头:会包含
Content-Type: text/xml; charset=utf-8,还有可选的SOAPAction头(值通常是服务命名空间+方法名,比如http://przelewy24.pl/TestAccess,部分服务可能不需要这个头) - 请求体:是一段XML,核心部分是
<TestAccess>节点,里面包含你的参数,大概长这样:
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <TestAccess xmlns="http://przelewy24.pl/service/"> <id>999</id> <key>anuniquekeyretrievedfromprzelewy24</key> </TestAccess> </soap:Body> </soap:Envelope>
服务端收到这个XML后,会解析出<TestAccess>节点,执行对应的权限验证逻辑,再返回包含结果的XML响应。
所以完全不用把TestAccess拼到URL里,URL只是服务的入口,实际要执行的操作是在请求体的XML里定义的~
内容的提问来源于stack exchange,提问作者Karol Selak
相关产品推荐
相关产品推荐

