3

Web サービス インターフェイスを使用して、Sage CRM の Python コンシューマーを作成しようとしています。私はSOAPpyをPython SOAPライブラリとして使用しています(それとは結婚しておらず、Ubuntuに簡単にインストールできたので一緒に行きました)。

Proxy を使用して WSDL をフェッチし、Sage CRM によって公開されたログオン メソッドを実行しました。


from SOAPpy import *
proxy = WSDL.Proxy('http://192.168.0.3/MATE/eware.dll/webservice/webservice.wsdl')

次のようなセッションオブジェクトを返します

SOAPpy.Types.structType の結果は 151924492: {'sessionid': '170911104429792'}

今、私は Sage CRM の queryrecord メソッドを使用してデータをクエリしようとしています。

Fault SOAP-ENV:Server: アクティブなユーザーセッションが検出されませんでした

ドキュメントを読むと、recd したセッション ID に返信する必要があることがわかります。各リクエストでログインしたとき。

Sageのドキュメントによると、そのまま返送する必要があります


SID = binding.logon("admin", ""); 
binding.SessionHeaderValue = new SessionHeader(); 
binding.SessionHeaderValue.sessionId = SID.sessionid;

SOAPpy を使用してヘッダーにこれを追加する方法はありますか?

どんなポインタでも大歓迎です。

4

2 に答える 2

0

First, just to comment on SOAPpy vs. other soap libraries... SOAPpy traditionally has been the easy-to-use library that didn't support complex data structures. So if it works for your case then you are better off. For more complex data structures in the WSDL you'd need to move ZSI.

Anyway, the documentation link for the project on SourceForge seems to be broken, so I'll just cut+paste the header documentation here with some minor formatting changes:

Using Headers

SOAPpy has a Header class to hold data for the header of a SOAP message. Each Header instance has methods to set/get the MustUnderstand attribute, and methods to set/get the Actor attribute.

SOAPpy also has a SOAPContext class so that each server method can be implemented in such a way that it gets the context of the connecting client. This includes both common SOAP information and connection information (see below for an example).

Client Examples

import SOAPpy
test = 42
server = SOAPpy.SOAPProxy("http://localhost:8888")
server = server._sa ("urn:soapinterop")

hd = SOAPpy.Header()
hd.InteropTestHeader ='This should fault, as you don\'t understand the header.'
hd._setMustUnderstand ('InteropTestHeader', 0)
hd._setActor ('InteropTestHeader','http://schemas.xmlsoap.org/soap/actor/next')
server = server._hd (hd)

print server.echoInteger (test)

This should succeed (provided the server has defined echoInteger), as it builds a valid header into this client with MustUnderstand set to 0 and then sends the SOAP with this header.

import SOAPpy
test = 42
server = SOAPpy.SOAPProxy("http://localhost:8888")
server = server._sa ("urn:soapinterop")
#Header
hd = SOAPpy.Header()
hd.InteropTestHeader = 'This should fault,as you don\'t understand the header.'
hd._setMustUnderstand ('InteropTestHeader', 1)
hd._setActor ('InteropTestHeader','http://schemas.xmlsoap.org/soap/actor/next')
server = server._hd (hd)

print server.echoInteger (test)

This should fail (even if the server has defined 'echoInteger'), as it builds a valid header into this client, but sets MustUnderstand to 1 for a message that the server presumably won't understand before sending.

于 2009-08-20T10:12:32.757 に答える