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

Sending XML Soap request using Python requests.post()

提问人:juju 提问时间:9/19/2018 更新时间:11/9/2023 访问量:11587

问:

我确信我这样做是错误的,因为我对Xml或SOAP一无所知,但我正在尝试使用Python requests.post()发送发送SOAP请求。我想我可以把正文作为纯文本传递。如果我使用,我会得到一个解码错误,说不能使用 Latin-1,即使我认为我把解码放在 .如果我使用,请求是成功的,但它说我有一个无效的根元素。我将如何解析以下xml文档?我只是尝试按照以下说明通过身份验证过程:https://developer.stamps.com/developer/docs/swsimv71.html#authenticationdata=bodyutf-8params=body

xml 元素 Tree 位于此处:https://swsim.testing.stamps.com/swsim/swsimv71.asmx?wsdl

我使用以下代码尝试 Post 请求发送我的凭据进行身份验证。如果你能让我知道我在哪里以及有多严重地搞砸了这个请求,我将不胜感激。

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)
xml soap xml 解析 python-requests

评论


答:

0赞 Lucas Giori Cesconetto 9/20/2018 #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

评论

0赞 hardmath 10/24/2018
@Sidonai:我不情愿地投票批准了你的编辑。一般来说,最好通过为原始海报留下评论来提供这种(即使是轻微的)实质性更正。
0赞 Sidonai 10/30/2018
@hardmath我之所以进行更正,是因为代码不可执行,这不仅仅是实质性的更正,或者你是什么意思?
0赞 hardmath 10/30/2018
@Sidonai:实质性更改是指以重大方式更改帖子的更改,而不是影响外观(拼写错误、格式等)而不影响帖子性质的“外观更改”。因此,对于实质性的更改,最好先将它们提供给原始发布者批准。
0赞 cyclical 1/8/2020
这是一个 Post 请求示例,而不是 SOAP 请求。我错了吗?
0赞 Anthony To 8/19/2022
对于来到这里并想知道@cyclical问题的人 - SOAP 请求是通过 HTTP POST 发出的