- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我以前使用过 SOAP,但很多很多年前,如果我能帮助它,尽量保持清醒。
短篇小说...
client.request :foo_web_serivce, :language_count, :body => { :foo_app_id => "...", :session_id => "..." }
,那么我会得到一个 Status 200
,但我的结果是 -1
,因为我认为 app_id 未被识别。<LanguageCount>
) 而不是 Savon 的调用 ( <foo_web_service:LanguageCount>
),那么我会得到一个 Status 500
。请提前告知并感谢。
说来话长...
使用 SOAP 客户端我可以看到正确的请求 XML 是:
User-Agent: Mac OS X; WebServicesCore (357)
Content-Type: text/xml
Host: redacted
Soapaction: http://tempuri.org/redacted/LanguageCount
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<LanguageCount xmlns="http://tempuri.org/">
<fooAppID xsi:type="xsd:string">12345678-1234-1234-1234-123456789123</fooAppID>
<sessionID xsi:type="xsd:string">12345678-1234-1234-1234-123456789123</sessionID>
</LanguageCount>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
但是,当我尝试在控制台中这样做时:
ruby-1.8.7-p302 > client = Savon::Client.new do |wsdl, http, wsse|
ruby-1.8.7-p302 > wsdl.document = "http://FooService.cloudapp.net/FooService.svc?wsdl"
ruby-1.8.7-p302 ?> end
=> #<Savon::Client:0x1055e2dc8 @http=#<HTTPI::Request:0x1055e2bc0>, @wsse=#<Savon::WSSE:0x1055e2b98>, @wsdl=#<Savon::WSDL::Document:0x1055e2c10 @request=#<HTTPI::Request:0x1055e2bc0>, @document="http://FooService.cloudapp.net/FooService.svc?wsdl">>
ruby-1.8.7-p302 >
ruby-1.8.7-p302 > client.request :language_count, :body => {:Foo_app_id => "12345678-1234-1234-1234-123456789123", :session_id => "12345678-1234-1234-1234-123456789123"}
Retrieving WSDL from: http://FooService.cloudapp.net/FooService.svc?wsdl
HTTPI executes HTTP GET using the net_http adapter
SOAP request: http://Fooservice.cloudapp.net/FooService.svc
SOAPAction: "LanguageCount", Content-Type: text/xml;charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:wsdl="http://tempuri.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><LanguageCount><FooAppId>12345678-1234-1234-1234-123456789123</FooAppId><sessionId>12345678-1234-1234-1234-123456789123</sessionId></LanguageCount></env:Body></env:Envelope>
HTTPI executes HTTP POST using the net_http adapter
SOAP response (status 500):
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Fault><faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode><faultstring xml:lang="en-US">The message with Action 'LanguageCount' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring></s:Fault></s:Body></s:Envelope>
Savon::SOAP::Fault: (a:ActionNotSupported) The message with Action 'LanguageCount' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
但是当我使用 foo_web_service 的命名空间时,我得到:
ruby-1.8.7-p302 > client = Savon::Client.new do |wsdl, http, wsse| ruby-1.8.7-p302 > wsdl.document = "http://FooService.cloudapp.net/FooService.svc?wsdl" ruby-1.8.7-p302 ?> end =>
#<Savon::Client:0x105882498 @http=#<HTTPI::Request:0x105882358>, @wsse=#<Savon::WSSE:0x105882330>, @wsdl=#<Savon::WSDL::Document:0x105882380 @request=#<HTTPI::Request:0x105882358>, @document="http://FooService.cloudapp.net/FooService.svc?wsdl">> ruby-1.8.7-p302 > ruby-1.8.7-p302 > client.request :Foo_web_service, :language_count, :body => {:Foo_app_id
=> "12345678-1234-1234-1234-123456789123", :session_id => "12345678-1234-1234-1234-123456789123"} Retrieving WSDL from: http://FooService.cloudapp.net/FooService.svc?wsdl HTTPI executes HTTP GET using the net_http adapter SOAP request: http://Fooservice.cloudapp.net/FooService.svc SOAPAction: "http://tempuri.org/FooService/LanguageCount", Content-Type: text/xml;charset=UTF-8 <?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:Foo_web_service="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><Foo_web_service:LanguageCount><FooAppId>12345678-1234-1234-1234-123456789123</FooAppId><sessionId>12345678-1234-1234-1234-123456789123</sessionId></Foo_web_service:LanguageCount></env:Body></env:Envelope> HTTPI executes HTTP POST using the net_http adapter SOAP response (status 200): <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><LanguageCountResponse xmlns="http://tempuri.org/"><LanguageCountResult>-1</LanguageCountResult></LanguageCountResponse></s:Body></s:Envelope>
=> #<Savon::SOAP::Response:0x105a2cca8 @http=#<HTTPI::Response:0x105a28ce8 @body="<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><LanguageCountResponse xmlns=\"http://tempuri.org/\"><LanguageCountResult>-1</LanguageCountResult></LanguageCountResponse></s:Body></s:Envelope>", @raw_body="<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><LanguageCountResponse xmlns=\"http://tempuri.org/\"><LanguageCountResult>-1</LanguageCountResult></LanguageCountResponse></s:Body></s:Envelope>", @code=200, @headers={"x-powered-by"=>"ASP.NET", "x-aspnet-version"=>"4.0.30319", "content-type"=>"text/xml; charset=utf-8", "date"=>"Sat, 02 Jul 2011 23:40:56 GMT", "server"=>"Microsoft-IIS/7.0", "content-length"=>"214", "cache-control"=>"private"}>, @soap_fault=Savon::SOAP::Fault, @http_error=Savon::HTTP::Error> ruby-1.8.7-p302 >
最佳答案
长话短说,我必须进行 3 处更改。
response = client.request :language_count
更改为response = client.request "LanguageCount"
:xmlns => "http://tempuri.org/"
client.http.headers["SOAPAction"] = '"http://tempuri.org/FooService/LanguageCount"'
希望这对我周末一直在 SOAP hell 中的人有所帮助,希望我能阻止其他人在那里。
关于ruby - 无法让 Savon 形成正确的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6560273/
我正在尝试关注讨论 here使用 Ruby 和 Savon。我能够检索 session ID,但是每当我执行来自需要身份验证(跟踪器)的客户端的请求时,我都会收到“授权失败”错误。 require '
我正在使用 savon 0.9.7 和 ruby 1.8.7,我提出以下要求: client = Savon::Client.new do wsdl.document = "http://lo
我正在尝试发出 soap 请求,但是当我使用 operation.body 方法时,每个数组似乎都不在 operation.build 之后的 xml 中。 这是 WSDL 的一部分: --
我正在尝试利用 ruby gem Savon 连接到 propertyware (http://propertyware.com/apidocs/Getting-Started) 提供的 Web
我正在尝试使用 Savon gem 连接到网络服务。我对服务的了解: wsdl 文件 url ".../service.svc?wsdl" 登录“登录” 密码“密码” 域“域” 我通过 SoapUI
我正在使用 savon gem 访问 abc 金融网络服务。我收到错误消息用户未授权。我正在使用此代码访问响应 @wsdl="https://webservice.abcfinancial.com/w
我正在编写一个 gem 来为 Ruby 添加对 SOAP 服务的支持(我讨厌自己这样做,但是,你知道,遗留系统感到孤独,需要找人谈谈),我想知道是否有办法我可以使用 Savon 作为客户端库编写一些测
如果我有以下 SOAP 请求: 0
我正在使用 Savon 2.6 来实现 SOAP 服务的客户端。我必须在数据库中保存原始请求和原始响应。获取原始 XML 响应不是问题,但如何获取原始 XML 请求? 我按以下方式使用 Savon:
当 Savon 解析 XML 时: 它返回一个散列 {MessageList: TradeMessage: [{@id: '123'},...,{@id: '456'}]}
我正在使用 Savon对于 SOAP 请求和 SOAP 请求 XML 的某些地方,我需要生成这段代码: 执行此操作的最佳方法是什么? 最佳答案 我找到了解决方案。 soap.bo
我在具有自签名证书的设备上执行 soap 请求。我设置了 verify_mode :none,但我仍然收到“深度 0 - 18:自签名证书”警告。我知道如果我可以设置 verify_callback,
我想从以下响应中读取 customer.customer_info_id 的值。我的回复还包括命名空间: 我尝试了以下方法: # Savon code tried:
我曾尝试在针对 WSDL 运行 Savon 时更改其日志记录,但未能成功更改日志记录级别。 我阅读了文档:http://rubiii.github.com/savon/#global_configur
在运行 Cucumber 测试时,我得到(除了测试结果)大量调试/日志相关的输出形式: D, [2013-03-06T12:21:38.911829 #49031] DEBUG -- : SOAP r
我正在使用 savon version 2 (使用 Ruby on Rails )调用 web 服务,我需要向我的信封注入(inject)一些额外的命名空间。就像是: 我在 Savon Git pr
我正在使用 Ruby Savon,我必须创建一个请求,其中包含一个数组,该数组中有属性。我的问题是如何在每个子数组中添加一个属性。 JOHN
在 Savon 1 中,我可以使用 soap.input 添加 xmlns,如下所示: soap_client = Savon.client("http://pathtowsdl.com/a.svc?
我可以在 Savon 日志中看到我的 SOAP 错误包含如下 XML: 666some evil error 有谁知道如何从响应中解析错误代码和描述?很抱歉,如果这是一个愚蠢的问题,但我已经尝试了所有
我正在开发一个使用 Savon 在多线程中连接到 SSL 安全 SOAP 服务的应用程序。 要求之一是使用持久的 SSL 连接。 “谷歌搜索”没有给出有意义的结果.. 除了关于 net-http-pe
我是一名优秀的程序员,十分优秀!