Travelport Galileo Python SOAP客户端
我需要开发一个Python的SOAP客户端,用于Travelport的Galileo通用API。
这是Travelport通用API的30天试用账号。
通用API用户ID:Universal API/uAPI2514620686-0edbb8e4
通用API密码:D54HWfck9nRZNPbXmpzCGwc95
Galileo的分支代码(1G):P7004130
网址:https://emea.universal-api.pp.travelport.com/B2BGateway/connect/uAPI/
这是来自Galileo文档的引用。
HTTP头信息
HTTP头信息包括:
SOAP端点,这些端点会根据以下因素有所不同:
- 地理区域。
- 请求的服务。在前面的例子中,使用的是HotelService作为端点;不过,服务名称会根据请求的内容进行修改。
gzip压缩,这是可选的,但强烈推荐。如果想在响应中接受gzip压缩,需要在头信息中指定“Accept-Encoding: gzip,deflate”。
授权,遵循标准的基本授权模式。
在“Authorization: Basic”后面的文本可以用Base 64编码。这种功能大多数编程语言都支持。
授权凭证的语法必须在用户名和密码前加上“Universal API/”这个前缀,这些是Travelport分配的。
POST https://americas.universal-api.pp.travelport.com/
B2BGateway/connect/uAPI/HotelService HTTP/2.0
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: ""
Authorization: Basic UniversalAPI/UserName:Password
Content-Length: length
这是我的Python代码:
import urllib2
import base64
import suds
class HTTPSudsPreprocessor(urllib2.BaseHandler):
def http_request(self, req):
message = \
"""
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:air="http://www.travelport.com/schema/air_v16_0" xmlns:com="http://www.travelport.com/schema/common_v13_0" -->
<soapenv:header>
<soapenv:body>
<air:availabilitysearchreq xmlns:air="http://www.travelport.com/schema/air_v16_0" xmlns:com="http://www.travelport.com/schema/common_v13_0" authorizedby="Test" targetbranch="P7004130">
<air:searchairleg>
<air:searchorigin>
<com:airport code="LHR">
</com:airport></air:searchorigin>
<air:searchdestination>
<com:airport code="JFK">
</com:airport></air:searchdestination>
<air:searchdeptime preferredtime="2011-11-08">
</air:searchdeptime></air:searchairleg>
</air:availabilitysearchreq>
</soapenv:body>
"""
auth = base64.b64encode('Universal API/uAPI2514620686-0edbb8e4:D54HWfck9nRZNPbXmpzCGwc95')
req.add_header('Content-Type', 'text/xml; charset=utf-8')
req.add_header('Accept', 'gzip,deflate')
req.add_header('Cache-Control','no-cache')
req.add_header('Pragma', 'no-cache')
req.add_header('SOAPAction', '')
req.add_header('Authorization', 'Basic %s'%(auth))
return req
https_request = http_request
URL = "https://emea.universal-api.pp.travelport.com/B2BGateway/connect/uAPI/"
https = suds.transport.https.HttpTransport()
opener = urllib2.build_opener(HTTPSudsPreprocessor)
https.urlopener = opener
suds.client.Client(URL, transport = https)
但是它没有工作。
Traceback (most recent call last):
File "soap.py", line 42, in <module>
suds.client.Client(URL, transport = https)
File "/usr/local/lib/python2.7/site-packages/suds/client.py", line 112, in __init__
self.wsdl = reader.open(url)
File "/usr/local/lib/python2.7/site-packages/suds/reader.py", line 152, in open
d = self.fn(url, self.options)
File "/usr/local/lib/python2.7/site-packages/suds/wsdl.py", line 136, in __init__
d = reader.open(url)
File "/usr/local/lib/python2.7/site-packages/suds/reader.py", line 79, in open
d = self.download(url)
File "/usr/local/lib/python2.7/site-packages/suds/reader.py", line 95, in download
fp = self.options.transport.open(Request(url))
File "/usr/local/lib/python2.7/site-packages/suds/transport/http.py", line 64, in open
raise TransportError(str(e), e.code, e.fp)
suds.transport.TransportError: HTTP Error 500: Dynamic backend host not specified
我已经尝试解决这个问题两个星期了,如果可以的话,请给我一些建议。
1 个回答
我觉得你可以试着从这个网址下载WSDL文件的ZIP压缩包:https://support.travelport.com/webhelp/uAPI/uAPI.htm#Getting_Started/Universal_API_Schemas_and_WSDLs.htm
这样你就可以使用这些WSDL文件来生成你的客户端类,因为在这个链接上:https://emea.universal-api.pp.travelport.com/B2BGateway/connect/uAPI/ 并没有提供WSDL的接口(比如 ?wsdl 或 /.wsdl)。