Python XML SOAP 请求返回 400 但 Postman 返回 200

问题描述 投票:0回答:3

我正在尝试使用请求查询 SOAP API,并且我能够让它在 Postman 中正常工作。 但是,当我尝试使用 Python 中的请求发出请求时,我不断收到 400 响应。

这是我到目前为止的代码:

from requests import Session
from zeep import Client
from zeep.transports import Transport
from zeep.wsa import WsAddressingPlugin
import contextlib
import OpenSSL.crypto
import os
import requests
import ssl
import tempfile
import certifi
import http.client
from OpenSSL import crypto
from zeep.wsse.signature import Signature
import xmlsec
import pprint
from json import dumps


headers = {'content-type':'application/soap+xml','action':'http://Blah/IBlah/EntitySearch'}
body = """
xml = <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:hsd="http://Blah">
   <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:Action>http://Blah/IBlah/EntitySearch</wsa:Action><wsa:To>https://blahblahblah:120/HSD.ProxyService/Blah.svc?wsdl</wsa:To></soap:Header>
   <soap:Body>
      <hsd:EntitySearch>
         <!--Optional:-->
         <hsd:request>
            <!--Optional:-->
            <hsd:EntityId>100000</hsd:EntityId>
         </hsd:request>    
      </hsd:EntitySearch>
   </soap:Body>
</soap:Envelope>""".encode('utf-8')

r = requests.post('https://blahblahblah:120/Blah.ProxyService/Blah.svc?wsdl',cert=('C:\\Users\\Me\\Desktop\\llama_cert.pem', 'C:\\Users\\Me\\Desktop\\llama.key'),data=body,headers=headers)
print(r.content)

SOAP XML 在 Postman 中确实可以工作,所以我不确定我哪里出了问题并得到了 400 响应。我从 POST 切换到 GET 并取出数据和标头,然后我能够从中得到 200 响应。 我也在 Zeep 中这样做了,但是 Zeep 要求我输入两个请求字段,而我确实需要让我的程序与其中一个一起工作。

我愿意接受任何有关如何解决此问题的想法。

python-3.x xml soap python-requests
3个回答
2
投票

即使这个问题已经有两年了,我认为它仍然有效。我遇到了同样的错误。最初,我有与你相同的请求标头,我将其更改为;

***headers = {
'Content-Type': 'application/soap+xml; charset=utf-8',
'SOAPAction': 'Retrieve'
}.***

它解决了我的错误,我开始收到客户的 200 OK 响应。 我希望它有帮助


0
投票

我遇到了类似的问题,Postman SOAP 请求总是返回 200,当我尝试使用请求库在 Python 中执行此操作时,它返回 500,表示我没有提供输入参数,只要我添加了 SOAPAction 标头.

我在 Postman 中的 SOAPAction 标头如下:

ReadMultiple

当在 Python 中尝试完全相同的方法时,它不起作用。现在我将其更改为

urn:microsoft-dynamics-schemas/page/nameoftheservice:ReadMultiple
并且它有效。

如果您格式化了有效负载,还值得尝试的是删除所有换行符。


0
投票

您需要检查帖子数据编码, 编码必须等于帖子标题编码

if headers = {'content-type':'application/soap+xml;字符集=utf-8'} soap_xml_utf8=soap_xml.encode(“utf-8”)

请求发布数据=soap_xml_utf8

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.