首页 > 解决方案 > Python XML SOAP 请求返回 400 但 Postman 返回 200

问题描述

我正在尝试使用请求查询 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.xxmlsoappython-requests

解决方案


推荐阅读