我遇到使用Savon发布SOAP的Ruby代码的问题
我有一个参数XML_BODY,显然没有被发送,或者,如果它是,接收它的Java代码看起来为null(如果我尝试返回"TEST"+ XML_BODY,响应显示"TEST null")
其他数据似乎发送好 - 真的很困惑
客户端操作是pub_mugs(),post(),subscribe()
这个Python/Zeep代码完全成功
from requests import Session
from zeep import Client
from zeep.transports import Transport
if __name__ == "__main__":
url="http://localhost:8080/Wormhole?wsdl"
with open('../../web/web/xsd/DETEP2012-with-content.xml', 'r') as f:
xml=f.read().replace('\n', '')
session = Session()
session.verify = False
transport = Transport(session=session)
client = Client(url, transport=transport)
print client.service.PubMugs(username='usr',password='pwd') #SUCCESS
print client.service.subscribe(username='usr',password='pwd') #SUCCESS
print client.service.post(username='usr',password='pwd',mug='110',XML_BODY=xml) #SUCCESS
Run Code Online (Sandbox Code Playgroud)
这个Ruby/Savon代码成功用于pub_mugs()和subscribe(),但是对于post()失败了
client = Savon.client(wsdl: ENV["WSDL"],
:ssl_verify_mode => :none,
:raise_errors => false,
pretty_print_xml: true)
doc = File.open("../web/web/xsd/DETEP2012-with-content.xml") { |f| Nokogiri::XML(f) }
xml = doc.to_xml.delete("\n").split(">",2)[1] …Run Code Online (Sandbox Code Playgroud) 如何使用python的zeep在http标头中为SOAP请求消息设置用户名和密码?我相信这就是为什么我得到连接拒绝错误但无法弄清楚可以设置http标头详细信息的位置.我甚至尝试在wsdl文件上运行python -mzeep(与创建客户端和调用Web服务方法相比),但它仍然无法连接.
我想将"Complex"Header传递给带有zeep库的SOAP服务
这是它应该是什么样子
<soapenv:Header>
<something:myVar1>FOO</something:myVar1>
<something:myVar2>JAM</something:myVar2>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)
我想我成功地以这种方式发送标题
header = xsd.Element(
'{http://urlofthews}Header',
xsd.ComplexType([
xsd.Element(
'{http://urlofthews}myVar1',
xsd.String()),
xsd.Element(
'{http://urlofthews}myVar2',
xsd.String())
])
)
header_value = header(myVar1='FOO',myVar2='JAM')
print (header_value)
datasoap=client.service.UserRessourcesCatalog(requete,_soapheaders=[header_value])
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用XSD在我的Header中声明并传递命名空间"something".
任何帮助?
先谢谢.
最好的祝福
正如文档中提到的那样
http://docs.python-zeep.org/en/master/headers.html
"另一种选择是传递一个lxml的Element对象.如果wsdl没有定义一个soap标头但服务器确实需要它,这通常很有用."
这是我的情况,所以我试过
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
ET.register_namespace('something', 'http://urlofthews')
headerXML = ET.Element("soapenv:Header")
var1 = ET.SubElement(headerXML, "something:myVar1")
var1.text = "FOO"
var2 = ET.SubElement(headerXML, "something:myVar2")
var2.text = "JAM"
headerDict=xmltodict.parse(ET.tostring(headerXML))
print (json.dumps(headerDict))
datasoap=client.service.UserRessourcesCatalog(requete,_soapheaders=headerDict)
Run Code Online (Sandbox Code Playgroud)
但我得到:ComplexType()得到了一个意外的关键字参数u'soapenv:Header'.签名:``
我想用Zeep解析WSDL文件并退出:
关于解析wsdl的任何示例?
我猜我应该使用zeep.wsdl和parse_service方法?
/一种
在我向Frontierlink Web Service发出SOAP请求时,直到出现此错误之前,我的代码一直在工作。
File "/home/venv/lib/python2.7/site-packages/OpenSSL/_util.py", line 54, in exception_from_error_queue
raise exception_type(errors)
Run Code Online (Sandbox Code Playgroud)
OpenSSL.SSL.Error:[(“ SSL例程”,“ SSL_CTX_use_certificate”,“ ca md太弱”))
我是否需要重新生成我用来连接的pem文件,或者问题出在我用来生成pem文件的.p12文件上?
如果您需要有关我的问题的更多信息,请告诉我。
笔记:
我使用的OpenSSL版本是:OpenSSL 1.0.2k-fips
先感谢您!
我想使用 zeep 进行一些 API 调用。预期输出是:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="https://cabapi-prod.service.dbrent.net/hal2_cabserver/">
<soap:Body>
<CABSERVER.listFreeBikes>
<CommonParams>
<UserData>
<User>XXXXXXXXXXXXXX</User>
<Password>XXXXXXXXXXXXXX</Password>
</UserData>
<LanguageUID>1</LanguageUID>
<RequestTime>XXXXXXXXXXXXXX</RequestTime>
<Version>2</Version>
</CommonParams>
<SearchPosition>
<Longitude>XXXXXXXXXXXXXX</Longitude>
<Latitude>XXXXXXXXXXXXXX</Latitude>
</SearchPosition>
<maxResults>100</maxResults>
<searchRadius>844</searchRadius>
<CustomerData>
<Phone>XXXXXXXXXXXXXX</Phone>
<Password>XXXXXXXXXXXXXX</Password>
<PhoneUserEdited>false</PhoneUserEdited>
</CustomerData>
</CABSERVER.listFreeBikes>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
但是,我只能得到:
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Body>
<ns0:CABSERVER.listFreeBikes xmlns:ns0="https://xml.dbcarsharing-buchung.de/hal2_cabserver/">
<CommonParams>
<UserData>
<User>XXXXXXXXXXXXXX</User>
<Password>XXXXXXXXXXXXXX</Password>
</UserData>
<LanguageUID>1</LanguageUID>
<RequestTime>XXXXXXXXXXXXXX</RequestTime>
<Version>2</Version>
</CommonParams>
<CustomerData>
<Phone>XXXXXXXXXXXXXX</Phone>
<Password>XXXXXXXXXXXXXX</Password>
<PhoneUserEdited>false</PhoneUserEdited>
</CustomerData>
<SearchPosition>
<Longitude>XXXXXXXXXXXXXX</Longitude>
<Latitude>XXXXXXXXXXXXXX</Latitude>
</SearchPosition>
<maxResults>100</maxResults>
<searchRadius>844</searchRadius>
</ns0:CABSERVER.listFreeBikes>
</soap-env:Body>
</soap-env:Envelope>
Run Code Online (Sandbox Code Playgroud)
服务器无法正确识别我的请求,我认为这是由于命名空间造成的。我做了一些研究,但没有找到将默认命名空间(xmlns)设置为https://xml.dbcarsharing-buchung.de/hal2_cabserver/的方法。相反,它被添加为额外的命名空间。
这是我当前的代码:
with client.settings(raw_response=True):
## Common Params related
### UserData related …Run Code Online (Sandbox Code Playgroud) 当我运行以下代码时,我不断收到以下错误:here is an error in XML document (113, 25). ---> The string '' is not a valid Boolean value.我不明白为什么会这样。这是文档,根据该文档,不需要布尔字段。
from zeep import Client
client = Client('http://services.resumeparsing.com/ResumeService.asmx?wsdl')
response = client.service.ParseResume(request={'AccountId': 'XXXXXXX',\
'ServiceKey':'XXXXXXXXX',\
'FileBytes': file_bytes, 'FileText': file_text, \
})
print(response)
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!
我正在使用 zeep (Python 3.6) 与 SOAP API 交互,并使用包含此部分的 WSDL 模式:
<xs:element name="passengers">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="passenger" type="com:PassengerType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
所以我希望我的 zeep 生成的 XML 看起来像这样:
<book:passengers>
<book:passenger>
...redacted...
</book:passenger>
</book:passengers>
Run Code Online (Sandbox Code Playgroud)
我用 Zeep 实现这一目标的第一次尝试如下所示:
passengers = [factories.PassengerType()]
Run Code Online (Sandbox Code Playgroud)
但是,将其发送到我的 SOAP API 时,会产生以下错误:
File "/usr/local/lib/python3.6/site-packages/zeep/xsd/elements/element.py", line 220, in validate
"Missing element %s" % (self.name), path=render_path)
zeep.exceptions.ValidationError: Missing element passenger (createBookingRecordRequest.passengers)
Run Code Online (Sandbox Code Playgroud)
我相信这是因为我的 'passengers' 属性应该包含一个带有标签名称“passenger”的 Zeep 对象,该对象将包含我的元素列表。我已经尝试修补zeep.xsd.AnyType以实现这一目标,但尚未成功。
任何建议,将不胜感激。
假设我使用 python zeep 对这样的服务器执行查询:
from zeep import Client
wsdl_url = "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL"
client = Client(wsdl_url)
result = client.service.ListOfContinentsByCode()
Run Code Online (Sandbox Code Playgroud)
我想看到从这个方法返回的原始 XML,即以某种方式从结果中提取它。这可能吗?如何?
我正在使用 ZEEP 连接到 NetSuite。创建发票时我需要传递给 NS 的参数之一是“类”。如果我理解正确,以下行无法编译的原因是因为 'class' 是保留关键字。
invoice = invoiceType(
customFieldList = customFieldList,
entity = entityRecord,
subsidiary = subRecord,
department = departmentRecord,
location = locationRecord,
class = classRecord
)
Run Code Online (Sandbox Code Playgroud)
我没有选择将最后一个参数从“类”更改为“类”或其他内容,因为这是 NetSuite 期望调用的参数。我可以在 python 中使用任何替代方法吗?有没有办法在将其作为参数传递时对其进行转义?
我有肥皂请求,想通过 python zeep 脚本发送它。
POST /IntegrationService/IntegrationService.asmx HTTP/1.1
Host: 192.168.66.2
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<SendHardwareCommand xmlns="http://parsec.ru/Parsec3IntergationService">
<sessionID>guid</sessionID>
<territoryID>guid</territoryID>
<command>int</command>
</SendHardwareCommand>
</soap12:Body>
</soap12:Envelope>
Run Code Online (Sandbox Code Playgroud)
我尝试自己写一下
from pprint import pprint
from zeep import Client
CODE = '1'
LOGIN = 'PARSEC'
PASSWORD = 'pass'
client = Client('http://192.168.66.2:10101/IntegrationService/IntegrationService.asmx?wsdl', strict=False)
result = client.service.SendHardwareCommand(
SendHardwareCommandRequest={'code': CODE, 'MessageType': 0},
AuthorizationHeader={'login': LOGIN, 'password': PASSWORD})
pprint(result)
Run Code Online (Sandbox Code Playgroud)
怎样做才正确呢?
我在创建自定义标头并将其添加到 SOAP 标头时遇到问题。如果我写一个 RAW 请求它可以工作,但我想在 Python3 中使用 zeep 库
我尝试添加这些标题
header = xsd.Element(
'headerMDMPeticio',xsd.ComplexType([
xsd.Element('idSistemaOrigen',xsd.String()),
xsd.Element(
'headerMidominio',xsd.ComplexType([
xsd.Element('usuariConnectat',xsd.String()),
xsd.Element('rolUsuariConnectat',xsd.String())
])
)
])
)
header_value = header(headerMidominio={'usuariConnectat':'user','rolUsuariConnectat':'roleExample'})
Run Code Online (Sandbox Code Playgroud)
摘自这些书https://buildmedia.readthedocs.org/media/pdf/python-zeep/master/python-zeep.pdf(第18页)
这是我正在使用的生成 XML 的 python 代码
header = xsd.Element(
'headerMDMPeticio',xsd.ComplexType([
xsd.Element('idSistemaOrigen',xsd.String()),
xsd.Element(
'headerMidominio',xsd.ComplexType([
xsd.Element('usuariConnectat',xsd.String()),
xsd.Element('rolUsuariConnectat',xsd.String())
])
)
])
)
header_value = header(headerMidominio={'usuariConnectat':'user','rolUsuariConnectat':'roleExample'})
Run Code Online (Sandbox Code Playgroud)
预期(从 SOAP UI 中提取),重点关注 v01:headerMDMPeticio 和此节点的子节点。在 body 内部我还需要添加 v012:usosDada 来请求。
Accept-Encoding: gzip,deflate
Content-Type: application/soap+xml;charset=UTF-8;action="http://services.dev.midominio.edu/soa/servei/CodisProjectesMDM/v01_00/consultarCodiProjecteMDMInput"
Content-Length: 1811
Host: services.dev.midominio.edu
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v01="http://midominio.edu/soa/esquema/ElementsComunsMDM/v01_00" xmlns:v011="http://midominio.edu/soa/esquema/ElementsComuns/v01_01" xmlns:v012="http://midominio.edu/soa/servei/MDMCodisProjectes/v01_00">
<soap:Header> …Run Code Online (Sandbox Code Playgroud) 我正在使用 SOAP API 来获取带有应该返回的 cookie 的身份验证密钥。
from zeep import Client
client = Client("AuthenticationService.xml")
result = client.service.ValidateUser(username, password, "")
result
Run Code Online (Sandbox Code Playgroud)
然而,结果是,我得到了 True 布尔值,但没有包含身份验证密钥的 Cookie。
从下图中,您可以看到使用 SoapUI 的同一请求返回一个 cookie。我想知道如何在 Python 中做到这一点。