使用Python request.post()发送XML Soap请求

时间:2018-09-18 19:08:12

标签: xml soap xml-parsing python-requests

由于我对Xml或SOAP一无所知,所以我确定自己在做各种错误,但是我正在尝试使用Python request.post()发送发送SOAP请求。我认为我可以将正文作为纯文本传递。如果我使用data=body,则会收到解码错误,提示无法使用Latin-1,即使我以为我将utf-8放在解码位置也是如此。如果我使用params=body,则请求成功,但是显示我的Root元素无效。我将如何解析以下xml文档?我只是按照这些说明尝试通过身份验证过程: https://developer.stamps.com/developer/docs/swsimv71.html#authentication

xml元素树在这里: https://swsim.testing.stamps.com/swsim/swsimv71.asmx?wsdl

我使用以下代码尝试发布请求,以发送我的凭据进行身份验证。如果您可以让我知道我在哪里以及如何严重地处理此请求,我将不胜感激。

url = "https://swsim.testing.stamps.com/swsim/swsimv71.asmx"

headers = {
    'User-Agent': 'Crosscheck Networks SOAPSonar',
    'content-type': 'text/xml',
    'charset': 'utf-8'
}

body = """
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:tns=“http://stamps.com/xml/namespace/2018/03/swsim/swsimv71”
>

    <soap:Body>

        <AuthenticateUser>

            <tns:Credentials>

                <IntegrationsID>
                    ID
                </IntegrationsID>

                <Username>
                    USERNAME
                </Username>

                <Password>
                    PASSWORD
                </Password>

            </tns:Credentials>

        </AuthenticateUser>

    </soap:Body>
</soap:Envelope>

"""

r = requests.post(url, headers=headers, params=body)
print(r.content)

1 个答案:

答案 0 :(得分:1)

我想这可能对您有帮助,我的朋友!

    import requests

    request = '''
    <?xml version="1.0" encoding="UTF-8"?>
    <Requ>
    <GivenName>Özdemam</GivenName>
    <FamilyNameGrünzl</FamilyName>
    </Requ>
    '''.encode('utf-8')
    headers = {'Content-Type': 'text/xml': 'charset=utf-8'}
    req = requests.Request('POST', 'http://192.168.1.5:8888/api',
                   headers=headers,
                   data=request)

    prepped_requ = req.prepare()
    s = requests.Session()
    http_response = s.send(prepped_requ)
    print http_response