python-3.x - 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 要求我输入两个请求字段,我真的需要让我的程序使用一个。
我愿意接受有关如何解决此问题的任何想法。
解决方案
推荐阅读
- java - 这个实现对单例是否正确?
- swift - 在 indexpath.item 以编程方式呈现 UIViewController(嵌入在 UITabBarController 中)
- python - 如何在 SQL Server 的列中快速重新索引值
- leaflet - 传单:带有工具提示和无工具提示的相同标记
- delphi - 打印机忽略纸张颜色变化
- java - Java 8 设置流循环并与数组元素进行比较
- laravel - Laravel - 控制器处理多个模型
- boost-asio - ASIO 定时器取消和生命周期问题
- laravel - 无法连接到laravel
- oracle - 无法在 Mac OS 中连接 SQL Developer