次の構造を持つ 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)