Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用Savon进行包含名称空间的SOAP调用_Ruby_Soap_Soapui_Soap Client_Savon - Fatal编程技术网

Ruby 如何使用Savon进行包含名称空间的SOAP调用

Ruby 如何使用Savon进行包含名称空间的SOAP调用,ruby,soap,soapui,soap-client,savon,Ruby,Soap,Soapui,Soap Client,Savon,我正在尝试连接到。具体来说,我正在尝试通过登录 文件规定,我应提出以下要求: POST /service/replicatorV4.asmx HTTP/1.1 Host: demo12231.srv106.webshopdemo.net Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/Login" <?xml version="1.0" encodin

我正在尝试连接到。具体来说,我正在尝试通过登录

文件规定,我应提出以下要求:

POST /service/replicatorV4.asmx HTTP/1.1
Host: demo12231.srv106.webshopdemo.net
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/Login"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Login xmlns="http://tempuri.org/">
      <username>string</username>
      <password>string</password>
    </Login>
  </soap:Body>
</soap:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
  <soapenv:Header/>
  <soapenv:Body>
    <tem:Login>
      <tem:username>Administrator</tem:username>
      <tem:password>passw0rd12</tem:password>
    </tem:Login>
  </soapenv:Body>
</soapenv:Envelope>
然后我得到了这个不满意的回答:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <LoginResponse xmlns="http://tempuri.org/">
      <LoginResult>48594fe6-41fd-45f9-9f84-89ef8c247b85</LoginResult>
    </LoginResponse>
  </soap:Body>
</soap:Envelope>
#<Savon::Response:0x007ff78cfcc368
 @globals=
  #<Savon::GlobalOptions:0x007ff782fb8160
   @option_type=:global,
   @options=
    {:encoding=>"UTF-8",
     :soap_version=>1,
     :namespaces=>{},
     :logger=>
      #<ActiveSupport::Logger:0x007ff78b136ea8
       @default_formatter=
        #<Logger::Formatter:0x007ff78b136e30 @datetime_format=nil>,
       @formatter=
        #<ActiveSupport::Logger::SimpleFormatter:0x007ff783e99f80
         @datetime_format=nil>,
       @level=0,
       @logdev=
        #<Logger::LogDevice:0x007ff78b136de0
         @dev=
          #<File:/Users/me/Projects/my_project/log/development.log>,
         @filename=nil,
         @mutex=
          #<Logger::LogDevice::LogDeviceMutex:0x007ff78b136db8
           @mon_count=0,
           @mon_mutex=#<Mutex:0x007ff78b136d68>,
           @mon_owner=nil>,
         @shift_age=nil,
         @shift_size=nil>,
       @progname=nil>,
     :log=>false,
     :filters=>[],
     :pretty_print_xml=>false,
     :raise_errors=>true,
     :strip_namespaces=>true,
     :convert_response_tags_to=>
      #<Proc:0x007ff782fc3e70@/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/savon-2.11.1/lib/savon/options.rb:85 (lambda)>,
     :convert_attributes_to=>
      #<Proc:0x007ff782fc3df8@/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/savon-2.11.1/lib/savon/options.rb:86 (lambda)>,
     :multipart=>false,
     :adapter=>nil,
     :use_wsa_headers=>false,
     :no_message_tag=>false,
     :follow_redirects=>false,
     :unwrap=>false,
     :host=>nil,
     :wsdl=>
      "http://demo12231.srv106.webshopdemo.net/service/replicatorV4.asmx?WSDL",
     :open_timeout=>100,
     :read_timeout=>100,
     :ssl_verify_mode=>:none,
     :convert_request_keys_to=>:camelcase,
     :endpoint=>
      #<URI::HTTP:0x007ff78479cbf0 URL:http://demo12231.srv106.webshopdemo.net/service/replicatorV4.asmx>}>,
 @http=
  #<HTTPI::Response:0x007ff78cfcd2b8
   @body=
    "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><soap:Body><LoginResponse xmlns=\"http://tempuri.org/\"><LoginResult xsi:nil=\"true\" /></LoginResponse></soap:Body></soap:Envelope>",
   @code=200,
   @headers=
    {"Cache-Control"=>"private, max-age=0",
     "Content-Type"=>"text/xml; charset=utf-8",
     "Server"=>"Microsoft-IIS/8.5",
     "Date"=>"Thu, 27 Aug 2015 05:29:42 GMT",
     "Content-Length"=>"335"},
   @raw_body=
    "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><soap:Body><LoginResponse xmlns=\"http://tempuri.org/\"><LoginResult xsi:nil=\"true\" /></LoginResponse></soap:Body></soap:Envelope>">,
 @locals=
  #<Savon::LocalOptions:0x007ff78ce7f550
   @option_type=:local,
   @options=
    {:advanced_typecasting=>true,
     :response_parser=>:nokogiri,
     :multipart=>false,
     :message=>{:username=>"Administrator", :password=>"passw0rd12"},
     :soap_action=>"http://tempuri.org/Login"}>>
这告诉我,也许服务确实收到了整个请求,但没有得到变量。该响应与我在SoapUI中使用错误的
用户名和
密码发出此请求时的响应非常相似:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <LoginResponse xmlns="http://tempuri.org/">
      <LoginResult xsi:nil="true"/>
    </LoginResponse>
  </soap:Body>
</soap:Envelope>


我注意到名称空间
tem
应该在变量中。这可能与我的问题有关吗?或者还有其他解释吗?

创建一个没有Rails的纯Ruby脚本

然后对照您使用SoapUI创建的内容检查输出。张贴差异,有人将能够提供帮助

运行此脚本时:

require 'savon'

c = Savon.client(wsdl:
                "http://demo12231.srv106.webshopdemo.net/service/replicatorV4.asmx?WSDL",
                log_level: :debug,
                log: true,
                pretty_print_xml: true)
response = c.call(:login,
                  :message => {:username => "Administrator", :password => "passw0rd12"})

它对我有用。可能是您的Rails部分中存在干扰。我不使用Rails,因此在这方面我帮不了什么忙(我更喜欢Sinatra:-)。

您是否已打开客户端日志并将输出与您的SoapUI消息进行比较?嗯,我不确定这些设置为什么会起作用,但它们确实。。。谢谢。我能看到的唯一主要区别是代码中使用了:convert\u request\u键。如果您删除该参数,事情可能会正常工作。
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <LoginResponse xmlns="http://tempuri.org/">
      <LoginResult xsi:nil="true"/>
    </LoginResponse>
  </soap:Body>
</soap:Envelope>
require 'savon'

c = Savon.client(wsdl:
                "http://demo12231.srv106.webshopdemo.net/service/replicatorV4.asmx?WSDL",
                log_level: :debug,
                log: true,
                pretty_print_xml: true)
response = c.call(:login,
                  :message => {:username => "Administrator", :password => "passw0rd12"})