首页 > 解决方案 > 从 WSDL 在 python 中实现一个 SOAP 客户端

问题描述

我想在 python 中使用 SOAP Web 服务。但我没有为这项工作找到任何像样的 python 肥皂客户端库。像 Zeep 这样的库太基础了,不支持复杂的安全策略。

我在互联网上搜索了几天没有成功。我将非常感谢您的帮助。

在找不到好的 Python 客户端后,我决定实现自己的客户端,但是 Ws-* 协议太复杂了!(尤其是安全部分),有成千上万的规范页面!所以我输了(实际上问题不在于 WS-* 协议本身,是的,它很复杂,但是必须阅读其他相关规范,例如 XML Signature ,加密...)。

我知道如果我重新阅读规范,我最终将能够理解它并实现该库,但我没有时间了。

这是该服务的一些 WSDL:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="....." targetNamespace="http://tempuri.org/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"
    xmlns:wsa10="http://www.w3.org/2005/08/addressing"
    xmlns:tns="http://tempuri.org/"
    xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
    xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
    xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
    xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsp:Policy wsu:Id="WS2007HttpBinding.....">
        <wsp:ExactlyOne>
            <wsp:All>
                <sp:TransportBinding
                    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                    <wsp:Policy>
                        <sp:TransportToken>
                            <wsp:Policy>
                                <sp:HttpsToken/>
                            </wsp:Policy>
                        </sp:TransportToken>
                        <sp:AlgorithmSuite>
                            <wsp:Policy>
                                <sp:Basic256/>
                            </wsp:Policy>
                        </sp:AlgorithmSuite>
                        <sp:Layout>
                            <wsp:Policy>
                                <sp:Strict/>
                            </wsp:Policy>
                        </sp:Layout>
                        <sp:IncludeTimestamp/>
                    </wsp:Policy>
                </sp:TransportBinding>
                <sp:EndorsingSupportingTokens
                    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                    <wsp:Policy>
                        <sp:SecureConversationToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                            <wsp:Policy>
                                <sp:BootstrapPolicy>
                                    <wsp:Policy>
                                        <sp:SignedParts>
                                            <sp:Body/>
                                            <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing"/>
                                            <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing"/>
                                            <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                                            <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                                            <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing"/>
                                            <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing"/>
                                            <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing"/>
                                        </sp:SignedParts>
                                        <sp:EncryptedParts>
                                            <sp:Body/>
                                        </sp:EncryptedParts>
                                        <sp:TransportBinding>
                                            <wsp:Policy>
                                                <sp:TransportToken>
                                                    <wsp:Policy>
                                                        <sp:HttpsToken/>
                                                    </wsp:Policy>
                                                </sp:TransportToken>
                                                <sp:AlgorithmSuite>
                                                    <wsp:Policy>
                                                        <sp:Basic256/>
                                                    </wsp:Policy>
                                                </sp:AlgorithmSuite>
                                                <sp:Layout>
                                                    <wsp:Policy>
                                                        <sp:Strict/>
                                                    </wsp:Policy>
                                                </sp:Layout>
                                                <sp:IncludeTimestamp/>
                                            </wsp:Policy>
                                        </sp:TransportBinding>
                                        <sp:SignedEncryptedSupportingTokens>
                                            <wsp:Policy>
                                                <sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                                                    <wsp:Policy>
                                                        <sp:WssUsernameToken10/>
                                                    </wsp:Policy>
                                                </sp:UsernameToken>
                                            </wsp:Policy>
                                        </sp:SignedEncryptedSupportingTokens>
                                        <sp:Wss11>
                                            <wsp:Policy/>
                                        </sp:Wss11>
                                        <sp:Trust13>
                                            <wsp:Policy>
                                                <sp:MustSupportIssuedTokens/>
                                                <sp:RequireClientEntropy/>
                                                <sp:RequireServerEntropy/>
                                            </wsp:Policy>
                                        </sp:Trust13>
                                    </wsp:Policy>
                                </sp:BootstrapPolicy>
                                <sp:MustNotSendAmend/>
                            </wsp:Policy>
                        </sp:SecureConversationToken>
                    </wsp:Policy>
                </sp:EndorsingSupportingTokens>
                <sp:Wss11
                    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                    <wsp:Policy/>
                </sp:Wss11>
                <sp:Trust13
                    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                    <wsp:Policy>
                        <sp:MustSupportIssuedTokens/>
                        <sp:RequireClientEntropy/>
                        <sp:RequireServerEntropy/>
                    </wsp:Policy>
                </sp:Trust13>
                <wsaw:UsingAddressing/>
            </wsp:All>
        </wsp:ExactlyOne>
    </wsp:Policy>
</wsdl:definitions>

有人可以简单地向我解释一下如何与这项服务交谈吗?

据我所知,有 5 个(或 4 个?!)策略都必须使用。我想我需要使用第<sp:EndorsingSupportingTokens>一个来获取令牌!然后在后续请求中使用该令牌。

标签: pythonweb-servicessoapwsdl

解决方案


推荐阅读