2

私はRubyとSavonを使用してここでの議論に従おうとしています。セッションIDを取得できますが、認証(トラッカー)を必要とするクライアントから要求を実行するたびに、AuthorizationFailedエラーが発生します。

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でこれを達成する方法はありますか、それともフォーラムのディスカッションを誤解していますか?

4

2 に答える 2

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"
      }
    }
  }
)
于 2013-05-31T07:42:34.270 に答える
0

古い質問ですが、うまくいけば誰かを助けるために情報を追加できると思いました。

私はlolsoapポラリオンと話すために使用しています。上記の結果のドキュメントでは、sessionID要素の名前空間と属性が削除されています。また、評価は正しくactormustUnderstand属性は無関係に見えます。

ヘッダーを適切に追加するには、すべての綿毛を使用して、それを取得しNokogiri::XML::Nodedupそれをドキュメントのヘッダーに追加する必要があります。これはnokogiri/のバグでありlibxml2、追加する前に Node を複製しない限り、子要素を追加すると名前空間が壊れることがよくあります [1]。

そのlolsoap中で次のようなことが行われます:

auth_header = login_response.nokogiri_doc.xpath("//*[local-name()='sessionID']")[0].dup
other_request.header.__node__ << auth_header

操作にご注意くださいdup。ランダムな SOAP リクエストのheader.__node__単なるヘッダーです。Nokogiri::XML::Element

このdup操作により、必要なすべての名前空間と属性が適切に定義された別の要素に目的の要素が追加されます。

savonリクエストXMLに直接触れることができるかどうかはわかりませんが、できると思います。したがって、HTH

[1] https://github.com/sparklemotion/nokogiri/issues/1200

于 2016-06-09T10:34:09.000 に答える