Я пытаюсь использовать Python и модуль zeep для доступа к Sabre SOAP API.В настоящее время я не могу создать сеанс, потому что постоянно получаю эту ошибку:
Fault: Action specified in EbxmlMessage does not exist.
Я искал решение в другом месте по переполнению стека, и в нескольких примерах это было потому, что разработчик использовал неправильное действиеназвание.Похоже, что это не так, поскольку в документации говорится, что действие называется «SessionCreateRQ», и я смог успешно создать сеанс (используя SessionCreateRQ) в SoapUI.
Вот мой код на данный момент:
from requests import Session
from zeep import Client
from zeep import xsd
from zeep.transports import Transport
from zeep.wsse.username import UsernameToken
s = Session()
s.proxies = {'http': "http://proxy:proxy@proxy:port",
'https': "https://proxy:proxy@proxy:port"}
wsdl = 'http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl'
client = Client(wsdl=wsdl, transport=Transport(session=s))
# Create the header XML structure
header = xsd.Element('MessageHeader', xsd.ComplexType([
xsd.Element('From', xsd.ComplexType([
xsd.Element('PartyId', xsd.String())
])
),
xsd.Element('To', xsd.ComplexType([
xsd.Element('PartyId', xsd.String())
])
),
xsd.Element('CPAId', xsd.String()),
xsd.Element('ConversationID', xsd.String()),
xsd.Element('Service', xsd.String()),
xsd.Element('Action', xsd.String()),
xsd.Element('MessageData', xsd.ComplexType([
xsd.Element('MessageID', xsd.String()),
xsd.Element('Timestamp', xsd.String()),
])),
])
)
# Apply the header values
header_value = header(
From={'PartyId': xsd.SkipValue},
To={'PartyId': xsd.SkipValue},
CPAId='IPCC',
ConversationID='ABC123@clientURL.com',
Service='Session',
Action='SessionCreateRQ',
MessageData={'MessageID': '1234',
'Timestamp': '2018-10-22T16:30:00Z'}
)
# Call the method
client.service.SessionCreateRQ(POS='IPCC', _soapheaders=[header_value])
Любые идеи, как я могу решить эту проблему?
Обновление: Я обновил свойСтруктура XML, предложенная Имраном, но я все еще получаю «Действие, указанное в EbxmlMessage, не существует:
header = xsd.Element('Header', xsd.ComplexType([
xsd.Element('MessageHeader', xsd.ComplexType([
xsd.Element('From', xsd.ComplexType([
xsd.Element('PartyId', xsd.String())
])
),
xsd.Element('To', xsd.ComplexType([
xsd.Element('PartyId', xsd.String())
])
),
xsd.Element('CPAId', xsd.String()),
xsd.Element('ConversationID', xsd.String()),
xsd.Element('Service', xsd.String()),
xsd.Element('Action', xsd.String()),
xsd.Element('MessageData', xsd.ComplexType([
xsd.Element('MessageID', xsd.String()),
xsd.Element('Timestamp', xsd.String()),
])),
])
),
xsd.Element('Security', xsd.ComplexType([
xsd.Element('UsernameToken', xsd.ComplexType([
xsd.Element('Username', xsd.String()),
xsd.Element('Password', xsd.String()),
xsd.Element('Organization', xsd.String()),
xsd.Element('Domain', xsd.String()),
]))
])
)
]))
# Apply the header values
header_values = header(MessageHeader={'From':{'PartyId': xsd.Nil},
'To': {'PartyId': xsd.Nil},
'CPAId': '1234',
'ConversationID': '1234',
'Service': 'SessionCreateRQ',
'Action': 'SessionCreateRQ',
'MessageData': {'MessageID': '1234',
'Timestamp': '2018-08-10T09:58:31Z'}},
Security={'UsernameToken': {'Username': 'username',
'Password': 'password',
'Organization': 'IPCC',
'Domain': 'AA'}})
client.service.SessionCreateRQ(POS='IPCC', _soapheaders=[header_value])