我试图使用Ruby和Savon来讨论here。我能够检索会话ID,但每当我从需要身份验证的客户端(跟踪器)执行请求时,我都会收到授权失败错误。
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实现这一目标,还是我误解了论坛讨论?
答案 0 :(得分:3)
我在同一个帖子后面临同样的问题。这就是我使它工作的方式(通过复制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"
}
}
}
)
答案 1 :(得分:0)
老问题,但我想我可以添加一些信息,希望能帮助别人。
我正在使用lolsoap
与极地交谈。在上面生成的文档中,sessionID
元素将从任何名称空间和属性中删除。此外,actor
和mustUnderstand
属性似乎无关紧要。
要正确添加标题,但需要获取Nokogiri::XML::Node
和dup
,然后将其添加到文档的标题中。这是nokogiri
/ libxml2
中的一个错误,添加子元素通常会破坏名称空间,除非在添加[1]之前克隆Node。
在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
是否允许用户直接触摸请求XML,但我猜它确实如此。因此HTH