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 ...

时遇到了原始错误