Ruby 使用savon和exacttarget';s的web服务

Ruby 使用savon和exacttarget';s的web服务,ruby,soap,wsdl,savon,exacttarget,Ruby,Soap,Wsdl,Savon,Exacttarget,我在为以下内容生成soap文档时遇到问题。这也是我第一次使用soap。经过一些研究和建议,savon似乎是一条出路 require 'savon' client = Savon::Client.new("https://webservice.exacttarget.com/etframework.wsdl") client.wsdl_soap_actions # [:create, :retrieve, :update, :delete, :query, :describe, :execut

我在为以下内容生成soap文档时遇到问题。这也是我第一次使用soap。经过一些研究和建议,savon似乎是一条出路

require 'savon'

client = Savon::Client.new("https://webservice.exacttarget.com/etframework.wsdl")

client.wsdl_soap_actions
# [:create, :retrieve, :update, :delete, :query, :describe, :execute, :perform, :configure, :schedule, :version_info, :extract, :get_system_status]

response = client.retrieve do |soap|
  soap.input = "Retrieve"
  soap.action = "Retrieve"
end
我在丢失的安全标头上遇到以下错误

Savon::SOAPFault: (q0:Security) Security requirements are not satisfied because the security header is not present in the incoming message.
 from /home/kj/.rvm/gems/ruby-1.9.2-p0/gems/savon-0.7.9/lib/savon/response.rb:141:in `handle_soap_fault'
 from /home/kj/.rvm/gems/ruby-1.9.2-p0/gems/savon-0.7.9/lib/savon/response.rb:81:in `initialize'
 from /home/kj/.rvm/gems/ruby-1.9.2-p0/gems/savon-0.7.9/lib/savon/client.rb:95:in `new'
 from /home/kj/.rvm/gems/ruby-1.9.2-p0/gems/savon-0.7.9/lib/savon/client.rb:95:in `method_missing'
 from (irb):8
 from /home/kj/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'
Savon::SOAPFault:(q0:Security)未满足安全要求,因为传入消息中不存在安全标头。
from/home/kj/.rvm/gems/ruby-1.9.2-p0/gems/savon-0.7.9/lib/savon/response.rb:141:in'handle\u soap\u fault'
from/home/kj/.rvm/gems/ruby-1.9.2-p0/gems/savon-0.7.9/lib/savon/response.rb:81:在“初始化”中
from/home/kj/.rvm/gems/ruby-1.9.2-p0/gems/savon-0.7.9/lib/savon/client.rb:95:in'new'
from/home/kj/.rvm/gems/ruby-1.9.2-p0/gems/savon-0.7.9/lib/savon/client.rb:95:in'method_missing'
来自(irb):8
from/home/kj/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in`'
我已经在这里粘贴了完整的回复


任何善良的灵魂能帮我解决这个问题吗?

您可能只需要发送您的API凭据:

Savon::WSSE.username = "USERNAME_HERE"
Savon::WSSE.password = "PASSWORD_HERE"

在发出请求之前。

Is应该是
client.wsdl.soap\u actions
ExactTarget的soap实现非常弱。您将无法使用Savon的soap\u操作。您需要将大部分信封手工编码为散列,并在标题中手动设置SOAPAction。尽管如此,Savon还是从信封标题中排除了大部分猜测。下面是一个获取筛选器订阅服务器列表的示例:

client = Savon::Client.new do | wsdl, http, wsse |
  wsdl.document = 'https://webservice.s4.exacttarget.com/etframework.wsdl'
  wsse.credentials "username", "password"
end

res = client.request :ins0, 'RetrieveRequestMsg' do
  soap.body = {
    'RetrieveRequest' => 
    {
      'ObjectType' => 'Subscriber', 
      'Properties' => ['ID', 'SubscriberKey'],
      :attributes! => 
      {
        'ins0:Filter' => {"xsi:type" => "ins0:SimpleFilterPart"}
      },
      'Filter'     => 
      {
        'Property'   => 'SubscriberKey', 
        'SimpleOperator' => 'like', 
        'Value'          => 'string_to_filter_by'
      }
    }
  }
  http.headers['SOAPAction'] = 'Retrieve'
end
您可能还需要从wsdl url中删除“s4”,具体取决于您的帐户类型。

查看此gem:


几天前遇到了它,它让生活变得轻松多了

我发现Bob Briski的答案很有帮助,但我相信Savon的答案已经更新了。下面是一个基于最新文档的小示例:

require 'savon'

client = Savon.client(
  wsdl: 'https://webservice.s6.exacttarget.com/etframework.wsdl',
  wsse_auth: [username, password],
  log: false,
  convert_request_keys_to: :camelcase
)

response = client.call(:retrieve, message: {
  retrieve_request: {
    object_type: 'List',
    properties: ['ID', 'List.ListName', 'List.Type', 'List.Category', 'Client.ID']
  }
})