2

次の構造を持つ SOAP サービスとやり取りするために、python suds (バージョン: 0.3.9 GA ビルド: R659-20100219) を使用しています。

サービス ( DPWSService ) tns="http://ejb.revitalization.services.ndg/"
プレフィックス (1)
ns0 = "http://ejb.revitalization.services.ndg/"
ポート (1):
(DPWSポート)
方法 (13):
addTimer(request request, )
deleteProvider(リクエスト request, )
deleteTimer(request request, )
doHarvest(リクエスト request, )
doIngest(request リクエスト, )
doNewUpdateProvider(request request, )
getHarvestHistory(GetHistoryRequest リクエスト, )
getIngestHistory(GetHistoryRequest リクエスト、)
getList(GetListType リクエスト, )
getListNames()
getProviderDetails(request request, )
getProviderStatistic(request request, )
getStatusProcess(リクエスト request, )
タイプ (63):
AddTimerResponse
CSWProviderDetailsTypes
確認タイプ
連絡先の種類
データ範囲タイプ
DeleteProviderResponse
DeleteTimerResponse
DoHarvestResponse
DoIngestResponse
DoNewUpdateProviderResponse
メール連絡先タイプ
GetHarvestHistoryResponse
GetHistoryRequest
GetIngestHistoryResponse
GetListNamesResponse
GetListResponse
GetListType
GetProcessStatusResponse
GetProviderDetailsResponse
GetProviderStatisticResponse
収穫履歴タイプ
HarvestProviderType
収穫の種類
IngestHistoryType
リスト名
OAIProviderDetailsTypes
プロセス ID タイプ
ProviderCommonType
プロバイダーの連絡先の種類
ProviderDetail
プロバイダの詳細タイプ
プロバイダ ID タイプ
ProviderStatistic
応答タイプ
TimerInfoCommonType
TimerInfoDetail
TimerInfoLogDetail
addTimer
addTimerResponse
プロバイダの削除
deleteProviderResponse
削除タイマー
deleteTimerResponse
収穫する
doHarvestResponse
摂取する
doIngestResponse
doNewUpdateProvider
doNewUpdateProviderResponse
getHarvestHistory
getHarvestHistoryResponse
getIngestHistory
getIngestHistoryResponse
getList
getListNames
getListNamesResponse
getListResponse
getProviderDetails
getProviderDetailsResponse
getProviderStatistic
getProviderStatisticResponse
getStatusProcess
getStatusProcessResponse

以下のような構造の SOAP リクエストを送信する必要があります。

<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://
ejb.revitalization.services.ndg/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns0:Body>
<ns1:doIngest>
<request>
<ns1:ProcessID ns1:id="1430"/>
<ns1:EmailReportID>1031</ns1:EmailReportID>
</request>
</ns1:doIngest>
</ns0:Body>
</SOAP-ENV:Envelope>

つまり、id 属性の前にターゲット名前空間を追加する必要があります。そうしないと、リクエストは失敗します:(

doIngest リクエスト オブジェクトを作成する方法をいくつか試しましたが、次のようなリクエストしか作成できません。

<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ejb.revitalization.services.ndg/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns0:Body>
<ns1:doIngest>
<request>
<ns1:ProcessID id="1441"/>
<ns1:EmailReportID>1031</ns1:EmailReportID>
</request>
</ns1:doIngest>
</ns0:Body>
</SOAP-ENV:Envelope>

つまり、id 属性にターゲット名前空間プレフィックスがありません。

私は次の変種を試しました:

request = wsClient.factory.create('doIngest.request')
request.EmailReportID = "1031"
request.ProcessID = wsClient.factory.create('ProcessIDType')
request.ProcessID._id= "1430"
result=wsClient.service.doIngest(request)

と:

request = wsClient.factory.create('{http://ejb.revitalization.services.ndg/}doIngest.request')
request.EmailReportID = "1031"
request.ProcessID = wsClient.factory.create('{http://ejb.revitalization.services.ndg/}ProcessIDType')
request.ProcessID._id="1430"
result=wsClient.service.doIngest(request)

と:

request = wsClient.factory.create('doIngest.request')
request.EmailReportID = emailIDs
request.ProcessID = wsClient.factory.create('ProcessIDType')
request.ProcessID._id = wsClient.factory.resolver.qualify('{http://ejb.revitalization.services.ndg/}_id')
request.ProcessID._id=procID
result=wsClient.service.doIngest(request)

しかし、私は同じSOAPリクエストを受け取ります

WSDL は次のことを教えてくれます。

<xs:complexType name="doIngest">
    <xs:sequence>
        <xs:element form="unqualified" minOccurs="0" name="request">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="ProcessID" type="tns:ProcessIDType"/>
                    <xs:element maxOccurs="unbounded" minOccurs="0" name="EmailReportID" type="xs:int"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="ProcessIDType">
    <xs:sequence/>
    <xs:attribute ref="tns:id" use="required"/>
    <xs:attribute ref="tns:status"/>
</xs:complexType>

これは、id が名前空間プレフィックスを必要としていることを示しています。

したがって、問題は、名前空間プレフィックスを id 属性に強制するにはどうすればよいかということです。

ガンジーに感​​謝

したがって、解決策は次のとおりです。

Suds を 0.4 に更新 (バージョン 0.3.9 では MessagePlugin が利用できなかったため)

それから:

class MyPlugin(MessagePlugin):
    def marshalled(self, context):
        ProcIDnode = context.envelope.getChild('Body').getChild('doIngest').getChild('request')[0]
        #Get the value of the id attribute  
        ProcIDattVal = ProcIDnode.get('id')
        #Remove the errant id, used as a tidy-up stage
        ProcIDnode.unset('id')
        #Get the namespace prefix for the target namespace 
        ProcIDnspref = ProcIDnode.findPrefix('http://ejb.revitalization.services.ndg/')
        #Create the new attribute name with namespace prefix applied
        newProcIDattname = ProcIDnspref + ':id'
        #Insert the new attribute.
        ProcIDnode.set(newProcIDattname,ProcIDattVal)
4

2 に答える 2

5

探しているのはsuds のドキュメントにあり、MessagePlugin と呼ばれます。整列化オプションを使用すると、送信前にメッセージを変更できます。プラグインとしてクライアントに追加する必要があります。

self.client = Client(url, plugins=[MyPlugin()])

整列化されたメソッドで、context.envelope チャイルドを検索します。python の vars() 関数は、この場所で非常に役立ちます。私が思うに、それはあなたにとって次のようなものになるはずです:

from suds.plugin import MessagePlugin
class MyPlugin(MessagePlugin):
    def marshalled(self, context):
        foo = context.envelope.getChild('Body').getChild...getChild(and so on)[0]
        foo.nsprefix = # or something like this

この「この部分のようなもの」については、リクエストをデバッグし(クライアントとトランスポートのデバッグをお勧めします)、エンティティの変数を探す必要があります。呼び方しか覚えていません。

私は先週これに座っていたので、時間を節約できるかもしれません:) 質問があれば書いてください。

于 2011-04-20T13:11:21.533 に答える
0

最善の解決策についてはわかりませんが、haufe.sharepoint モジュール (PyPI 上) を介して Sharepoint と通信しているときに、同様の問題に遭遇しました。必要に応じて名前空間を変更するために、suds の send() にモンキー パッチを適用することになりました。モジュールのpatches.pyファイルでコードを確認できます。

于 2011-04-04T14:35:59.420 に答える