QuickBooks Web 连接器:"QuickBooks found an error when parsing the provided XML text stream" 但 qb*XML 验证器说 xml 有效
QuickBooks Web Connector: "QuickBooks found an error when parsing the provided XML text stream" but qb*XML Validator says xml is valid
QuickBooks Web 连接器正在向我的 receiveResponseXML 方法发送 QuickBooks found an error when parsing the provided XML text stream.
消息,即使我的 xml 在 qb*XML 验证器中签出。我在下面包含了我的 QBTalker class 中的 authenticate 和 sendRequestXML 方法(其他必需的方法也在 class 中;QB Web Connector 与 clientVersion、authenticate、sendRequestXML 在将 hresult 值 0x80040400
和消息值 QuickBooks found an error when parsing the provided XML text stream.
发送到 receiveResponseXML 之前的顺序):
class QBTalker(ServiceBase):
qbxml_version = ''
request_seq_no = 0
ticket_id = ''
@srpc(String, String, _returns=Iterable(String))
def authenticate(user, pswd):
#ticket_id = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(50))
QBTalker.ticket_id = 'COMPANY NAME IN QUICKBOOKS'
for each in [QBTalker.ticket_id, '', '', '']:
yield each
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=String)
def sendRequestXML(id, strHCPResponse, strCompanyFileName, qbXMLCountry, qbXMLMajorVers, qbXMLMinorVers):
'''if id != QBTalker.ticket_id:
return -1
else:
'''
qbxml_version = str(qbXMLMajorVers) + '.' + str(qbXMLMinorVers)
QBTalker.request_seq_no += 1
xml = '''<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="13.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<CustomerQueryRq requestID="2">
<FullName>COMPANY NAME IN QUICKBOOKS</FullName>
</CustomerQueryRq>
</QBXMLMsgsRq>
</QBXML>
'''
QBTalker.request_seq_no = 99
root = lxml.etree.fromstring(xml)
return lxml.etree.tostring(root)
@srpc(String, String, String, String, _returns=Integer8)
def receiveResponseXML(ticket, response, hresult, message):
response = response
hresult = hresult
message = message
return 100
@srpc(String, String, String, _returns=String)
def connectionError(ticket, hresult, message):
print("QuickBooks Web Connector says a connection error has occurred.")
print("hresult is " + hresult)
print("message is " + message)
@srpc(String, _returns=String)
def getLastError(ticket):
print("QuickBooks Web Connector is asking for the last error on ticket id " + ticket if ticket else "None")
return ticket
@srpc(String, _returns=String)
def closeConnection(ticket):
print("QuickBooks Web Connector is closing the connection for ticket id " + ticket if ticket else "None")
return ticket
if __name__=='__main__':
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('spyne.protocol.xml').setLevel(logging.DEBUG)
app = Application([QBTalker], tns='http://developer.intuit.com/',
in_protocol=Soap11(validator='lxml'),
out_protocol=Soap11(encoding='UTF-8', xml_declaration=True),
)
wsgi_app = WsgiApplication(app)
server = make_server('localhost', 7789, wsgi_app)
server.serve_forever()
更新:
好的,我通过添加以下导入语句
消除了 "QuickBooks found an error when parsing the provided XML text stream" 错误
from spyne.model.primitive import AnyXml
并更改 def sendRequestXML 行上方的修饰符行 from
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=String)
至
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=AnyXml)
我认为这可能会将 mime 类型从 text/html 更改为 text/xml,但我不确定。我也改了
def authenticate(user, pswd):
至
def authenticate(strUserName, strPassword):
和
def sendRequestXML(id, strHCPResponse, strCompanyFileName, qbXMLCountry, qbXMLMajorVers, qbXMLMinorVers):
至
def sendRequestXML(ticket, strHCPResponse, strCompanyFileName, qbXMLCountry, qbXMLMajorVers, qbXMLMinorVers):
据我所知,函数参数的名称是特定的。
但是,我的查询仍然没有返回任何内容。谁能指出我应该改变什么?我使用的值与在上面的代码中为 COMPANY NAME IN QUICKBOOKS 的 !CUST iif 文件中的 NAME 字段输入的值相同。在此先感谢您的帮助。
尽管在改变
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=String)
到
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=AnyXml)
修复了我遇到的 xml 错误,我仍然没有收到任何关于我的查询的反馈。从那时起,我安装了 RawCap.exe 并查看了我的 Web 服务与 QuickBooks Web 连接器之间的通信,并将其与创建客户时 QuickBooks Php DevKit 与 Web 连接器之间的通信进行了比较。我注意到我的网络服务正在从数据包中剥离 <?qbxml version="13.0" ?>
标签。所以我改变了
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=AnyXml)
回到
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=Unicode)
我变了
root = lxml.etree.fromstring(xml)
return lxml.etree.tostring(root)
到
#root = lxml.etree.fromstring(xml)
#return lxml.etree.tostring(root)
return xml
和
app = Application([QBTalker], tns='http://developer.intuit.com/',
in_protocol=Soap11(validator='soft'),
out_protocol=Soap11(),
)
到
app = Application([QBTalker], tns='http://developer.intuit.com/',
in_protocol=Soap11(validator='soft'),
out_protocol=Soap11(encoding='UTF-8', xml_declaration=True),
)
它开始工作了。这些键似乎一直在删除 lxml.etree 解析并将装饰器函数中的 return 类型从 AnyXml 更改为 String 或 Unicode,尽管我最初更改为使用 lxml.etree 解析的原因是因为我在 returning unicode ...
时遇到了原始错误
QuickBooks Web 连接器正在向我的 receiveResponseXML 方法发送 QuickBooks found an error when parsing the provided XML text stream.
消息,即使我的 xml 在 qb*XML 验证器中签出。我在下面包含了我的 QBTalker class 中的 authenticate 和 sendRequestXML 方法(其他必需的方法也在 class 中;QB Web Connector 与 clientVersion、authenticate、sendRequestXML 在将 hresult 值 0x80040400
和消息值 QuickBooks found an error when parsing the provided XML text stream.
发送到 receiveResponseXML 之前的顺序):
class QBTalker(ServiceBase):
qbxml_version = ''
request_seq_no = 0
ticket_id = ''
@srpc(String, String, _returns=Iterable(String))
def authenticate(user, pswd):
#ticket_id = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(50))
QBTalker.ticket_id = 'COMPANY NAME IN QUICKBOOKS'
for each in [QBTalker.ticket_id, '', '', '']:
yield each
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=String)
def sendRequestXML(id, strHCPResponse, strCompanyFileName, qbXMLCountry, qbXMLMajorVers, qbXMLMinorVers):
'''if id != QBTalker.ticket_id:
return -1
else:
'''
qbxml_version = str(qbXMLMajorVers) + '.' + str(qbXMLMinorVers)
QBTalker.request_seq_no += 1
xml = '''<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="13.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<CustomerQueryRq requestID="2">
<FullName>COMPANY NAME IN QUICKBOOKS</FullName>
</CustomerQueryRq>
</QBXMLMsgsRq>
</QBXML>
'''
QBTalker.request_seq_no = 99
root = lxml.etree.fromstring(xml)
return lxml.etree.tostring(root)
@srpc(String, String, String, String, _returns=Integer8)
def receiveResponseXML(ticket, response, hresult, message):
response = response
hresult = hresult
message = message
return 100
@srpc(String, String, String, _returns=String)
def connectionError(ticket, hresult, message):
print("QuickBooks Web Connector says a connection error has occurred.")
print("hresult is " + hresult)
print("message is " + message)
@srpc(String, _returns=String)
def getLastError(ticket):
print("QuickBooks Web Connector is asking for the last error on ticket id " + ticket if ticket else "None")
return ticket
@srpc(String, _returns=String)
def closeConnection(ticket):
print("QuickBooks Web Connector is closing the connection for ticket id " + ticket if ticket else "None")
return ticket
if __name__=='__main__':
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('spyne.protocol.xml').setLevel(logging.DEBUG)
app = Application([QBTalker], tns='http://developer.intuit.com/',
in_protocol=Soap11(validator='lxml'),
out_protocol=Soap11(encoding='UTF-8', xml_declaration=True),
)
wsgi_app = WsgiApplication(app)
server = make_server('localhost', 7789, wsgi_app)
server.serve_forever()
更新: 好的,我通过添加以下导入语句
消除了 "QuickBooks found an error when parsing the provided XML text stream" 错误from spyne.model.primitive import AnyXml
并更改 def sendRequestXML 行上方的修饰符行 from
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=String)
至
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=AnyXml)
我认为这可能会将 mime 类型从 text/html 更改为 text/xml,但我不确定。我也改了
def authenticate(user, pswd):
至
def authenticate(strUserName, strPassword):
和
def sendRequestXML(id, strHCPResponse, strCompanyFileName, qbXMLCountry, qbXMLMajorVers, qbXMLMinorVers):
至
def sendRequestXML(ticket, strHCPResponse, strCompanyFileName, qbXMLCountry, qbXMLMajorVers, qbXMLMinorVers):
据我所知,函数参数的名称是特定的。
但是,我的查询仍然没有返回任何内容。谁能指出我应该改变什么?我使用的值与在上面的代码中为 COMPANY NAME IN QUICKBOOKS 的 !CUST iif 文件中的 NAME 字段输入的值相同。在此先感谢您的帮助。
尽管在改变
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=String)
到
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=AnyXml)
修复了我遇到的 xml 错误,我仍然没有收到任何关于我的查询的反馈。从那时起,我安装了 RawCap.exe 并查看了我的 Web 服务与 QuickBooks Web 连接器之间的通信,并将其与创建客户时 QuickBooks Php DevKit 与 Web 连接器之间的通信进行了比较。我注意到我的网络服务正在从数据包中剥离 <?qbxml version="13.0" ?>
标签。所以我改变了
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=AnyXml)
回到
@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=Unicode)
我变了
root = lxml.etree.fromstring(xml)
return lxml.etree.tostring(root)
到
#root = lxml.etree.fromstring(xml)
#return lxml.etree.tostring(root)
return xml
和
app = Application([QBTalker], tns='http://developer.intuit.com/',
in_protocol=Soap11(validator='soft'),
out_protocol=Soap11(),
)
到
app = Application([QBTalker], tns='http://developer.intuit.com/',
in_protocol=Soap11(validator='soft'),
out_protocol=Soap11(encoding='UTF-8', xml_declaration=True),
)
它开始工作了。这些键似乎一直在删除 lxml.etree 解析并将装饰器函数中的 return 类型从 AnyXml 更改为 String 或 Unicode,尽管我最初更改为使用 lxml.etree 解析的原因是因为我在 returning unicode ...
时遇到了原始错误