我正在尝试使用Ruby和Savon来跟踪讨论here。我能够检索会话ID,但是每当我执行来自需要身份验证(跟踪器)的客户端的请求时,我都会收到一个Authorization Failed错误。
require 'Savon'
tracker_url = 'http://myserver/polarion/ws/services/TrackerWebService?wsdl'
session_url = 'http://myserver/polarion/ws/services/SessionWebService?wsdl'
# todo handle bad login credentials gracefully
session_client = Savon.client(wsdl: session_url)
response = session_client.call(:log_in, message: {user_name: 'lsimons', password: 'mypassword'})
session_id = response.header[:session_id]
puts "Session ID: #{session_id}"
tracker_client = Savon.client(wsdl: tracker_url, soap_header: {"session" => session_id}, headers: {"sessionID" => session_id})
puts "Requesting Workitem"
begin
tracker_client.call(:get_work_item_by_id, message: {project_id: 'myProject', workitem_id: 'myWorkitem'})
rescue
puts "Client call failed"
end此代码为tracker_client创建以下SOAP请求:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins0="http://ws.polarion.com/TrackerWebService-impl" xmlns:ins1="http://ws.polarion.com/types" xmlns:ins2="http://ws.polarion.com/TrackerWebService-types" xmlns:ins3="http://ws.polarion.com/ProjectWebService-types" xmlns:tns1="http://ws.polarion.com/TrackerWebService" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Header>
<session>2164640482421325916</session>
</env:Header>
<env:Body>
<tns1:getWorkItemById>
<ins0:projectId>myProject</ins0:projectId>
<ins0:workitemId>myWorkitem</ins0:workitemId>
</tns1:getWorkItemById>
</env:Body>
</env:Envelope>但是,在论坛讨论中,sessionID元素出现在标题之前。我不认为使用标准SOAP可以做到这一点?有没有办法通过Savon实现这一点,或者我曲解了论坛的讨论?
发布于 2013-05-31 15:42:34
在同样的主题下,我也遇到了同样的问题。这是我是如何工作的(通过复制log_in请求的响应头):
tracker_client = Savon.client(
wsdl: tracker_url,
soap_header: {
"ns1:sessionID" => session_id,
:attributes! => {
"ns1:sessionID" => {
"env:actor" => "http://schemas.xmlsoap.org/soap/actor/next",
"env:mustUnderstand" => "0",
"xmlns:ns1" => "http://ws.polarion.com/session"
}
}
}
)发布于 2016-06-09 18:34:09
老问题,但我想我可以添加一些信息,希望能帮助到一些人。
我正在使用lolsoap与polarion交谈。在上面的结果文档中,sessionID元素删除了所有名称空间和属性。此外,actor和mustUnderstand属性似乎无关紧要的评估也是正确的。
要正确添加头部,需要获取Nokogiri::XML::Node并对其进行dup,然后将其添加到文档的头部。这是nokogiri/libxml2中的一个错误,添加子元素通常会破坏名称空间,除非在添加1之前克隆节点。
在lolsoap中,它是这样做的:
auth_header = login_response.nokogiri_doc.xpath("//*[local-name()='sessionID']")[0].dup
other_request.header.__node__ << auth_header请注意dup操作。header.__node__只是一个随机SOAP请求的头Nokogiri::XML::Element。
dup操作可以将所需的元素添加到另一个元素中,并正确定义所有必需的名称空间和属性。
我不知道savon是否允许直接接触request XML,但我想它是允许的。因此HTH
https://stackoverflow.com/questions/14320978
复制相似问题