使用 zeep.Client Python 将自定义标头添加到 SOAP 请求

Gui*_*lle 1 soap python-3.x zeep

我在创建自定义标头并将其添加到 SOAP 标头时遇到问题。如果我写一个 RAW 请求它可以工作,但我想在 Python3 中使用 zeep 库

我尝试添加这些标题

header = xsd.Element(
        'headerMDMPeticio',xsd.ComplexType([
            xsd.Element('idSistemaOrigen',xsd.String()),
            xsd.Element(
                'headerMidominio',xsd.ComplexType([
                    xsd.Element('usuariConnectat',xsd.String()),
                    xsd.Element('rolUsuariConnectat',xsd.String())
                ])
            )
        ])
    )
header_value = header(headerMidominio={'usuariConnectat':'user','rolUsuariConnectat':'roleExample'})
Run Code Online (Sandbox Code Playgroud)

摘自这些书https://buildmedia.readthedocs.org/media/pdf/python-zeep/master/python-zeep.pdf(第18页)

这是我正在使用的生成 XML 的 python 代码

header = xsd.Element(
        'headerMDMPeticio',xsd.ComplexType([
            xsd.Element('idSistemaOrigen',xsd.String()),
            xsd.Element(
                'headerMidominio',xsd.ComplexType([
                    xsd.Element('usuariConnectat',xsd.String()),
                    xsd.Element('rolUsuariConnectat',xsd.String())
                ])
            )
        ])
    )
header_value = header(headerMidominio={'usuariConnectat':'user','rolUsuariConnectat':'roleExample'})
Run Code Online (Sandbox Code Playgroud)

预期(从 SOAP UI 中提取),重点关注 v01:headerMDMPeticio 和此节点的子节点。在 body 内部我还需要添加 v012:usosDada 来请求。

Accept-Encoding: gzip,deflate
Content-Type: application/soap+xml;charset=UTF-8;action="http://services.dev.midominio.edu/soa/servei/CodisProjectesMDM/v01_00/consultarCodiProjecteMDMInput"
Content-Length: 1811
Host: services.dev.midominio.edu
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v01="http://midominio.edu/soa/esquema/ElementsComunsMDM/v01_00" xmlns:v011="http://midominio.edu/soa/esquema/ElementsComuns/v01_01" xmlns:v012="http://midominio.edu/soa/servei/MDMCodisProjectes/v01_00">
    <soap:Header>
        <wsse:Security soap:mustUnderstand="true" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:UsernameToken wsu:Id="UsernameToken-6e6f6d657365617363757472656e6f6F">
                <wsse:Username>developer_user</wsse:Username>
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">miPasswordEnTextoPlano</wsse:Password>
                <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">rndomDataHash+rndomtxt==</wsse:Nonce>
                <wsu:Created>2019-06-05T08:20:45.644Z</wsu:Created>
            </wsse:UsernameToken>
        </wsse:Security>
        <v01:headerMDMPeticio>
            <v01:idSistemaOrigen>1</v01:idSistemaOrigen>
            <v01:headerMidominio>
                <v011:usuariConnectat>usuarioPlataforma</v011:usuariConnectat>
                <v011:rolUsuariConnectat>pepitoPalote</v011:rolUsuariConnectat>
            </v01:headerMidominio>
        </v01:headerMDMPeticio>
    </soap:Header>
   <soap:Body>
      <v012:consultarCodiProjecteMDMInput>
         <v012:idMDM>100045976</v012:idMDM>
         <v012:usosDada>
            <v01:arrayUsosDeDadaItem>
               <v01:tipus>Prova persona</v01:tipus>
            </v01:arrayUsosDeDadaItem>
         </v012:usosDada>
      </v012:consultarCodiProjecteMDMInput>
   </soap:Body>
</soap:Envelope
Run Code Online (Sandbox Code Playgroud)

这是我用 Python 代码生成的

<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope">
    <soap-env:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <wsse:UsernameToken>
                <wsse:Username>developer_user</wsse:Username>
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">miPasswordEnTextoPlano</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
    </soap-env:Header>
    <soap-env:Body>
        <ns0:consultarCodiProjecteMDMInput xmlns:ns0="https://services.dev.midominio.edu/soa/servei/MDMCodisProjectes/v01_00">
            <ns0:idMDM>100045976</ns0:idMDM>
        </ns0:consultarCodiProjecteMDMInput>
    </soap-env:Body>
</soap-env:Envelope>
Run Code Online (Sandbox Code Playgroud)

Jef*_*ent 6

Zeep 要求您在特殊的 kwarg 中定义标头_soapheaders,如下所示:

from zeep import Client

wsdl = 'http://localhost/services/Assets?wsdl'

client = Client(wsdl)

request_data = {
    "InterplayPathURI" : "interplay://TGAvid/Projects",
    "SearchGroup" : {
        "Operator" : "OR",
        "AttributeCondition" : {
            "Condition" : "EQUALS",
            "Attribute" :
            {"Group" : "SYSTEM",
             "Name": "Type",
             "_value_1": "masterclip"},
            },
        },
    "MaxResults" : "500",
}

header_value = {
    "credentialsHeader" : {
        "Username" : "administrator",
        "Password" : "Avid123"
    }
}

result = client.service.Search(**request_data, _soapheaders=header_value)
Run Code Online (Sandbox Code Playgroud)