如何将 QueryXML 与 SUDS 和 AutotaskAPI 一起使用

How to use QueryXML with SUDS and AutotaskAPI

我一直在尝试使用使用 QueryXML 的 AutotaskAPI 的 query() 方法。为此,我知道我必须使用 ATWSResponse 类型才能接收结果。这是我的代码:

class ConnectATWS():
    def __init__(self):
        #Connect to server with the credentials
        app_config = Init()
        self.username = app_config.data["Username"]
        self.password = app_config.data["Password"]
        self.login_id = app_config.data["LoginID"]
        self.url = app_config.data["AutotaskUpdateTicketEstimatedHours_net_autotask_webservices5_ATWS"]
        strCurrentID = "0"
        strCriteria = "<condition><field>Status<expression op=""NotEqual"">5</expression></field></condition>"
        strQuery = "<queryxml><entity>Ticket</entity><query>" + \
                        "<condition><field>id<expression op=""greaterthan"">" + strCurrentID + "</expression></field></condition>" + strCriteria + \
                        "<condition><field>EstimatedHours<expression op=""isnull""></expression></field></condition>" + \
                        "</query></queryxml>"

        client = Client(self.url + "?WSDL", username=self.login_id, password=self.password)
        response = client.service.query(strQuery)

尝试这个 returns 出现以下错误:

No handlers could be found for logger "suds.client"
Traceback (most recent call last):
  File "/Users/AAAA/Documents/Aptana/AutotaskUpdateTicketEstimatedHours/Main.py", line 46, in <module>
    handler = ConnectATWS()
  File "/Users/AAAA/Documents/Aptana/AutotaskUpdateTicketEstimatedHours/Main.py", line 40, in __init__
    response = client.service.query(strQuery)
  File "/Library/Python/2.7/site-packages/suds/client.py", line 542, in __call__
    return client.invoke(args, kwargs)
  File "/Library/Python/2.7/site-packages/suds/client.py", line 602, in invoke
    result = self.send(soapenv)
  File "/Library/Python/2.7/site-packages/suds/client.py", line 649, in send
    result = self.failed(binding, e)
  File "/Library/Python/2.7/site-packages/suds/client.py", line 708, in failed
    raise Exception((status, reason))
Exception: (307, u'Temporary Redirect')

我知道我没有正确调用该方法。我如何使用 QueryXML 和 ATWSResponse 类型调用 AutotaskAPI?

作为参考,这是 AutotaskAPI 文档: https://support.netserve365.com/help/Content/Userguides/T_WebServicesAPIv1_5.pdf

更新:

根据 Bodsda 的建议,我的完整代码如下所示:

import os, sys
import xml.etree.ElementTree as ET
from suds.client import Client
from suds.sax.element import Element


class Init():
    def __init__(self):
        #Search the app.config file for all data to be used
        script_dir = os.path.dirname(__file__)
        file_path = "app.config"
        abs_file_path = os.path.join(script_dir, file_path) 

        tree = ET.parse(abs_file_path)
        root = tree.getroot()
        sites = root.iter('AutotaskUpdateTicketEstimatedHours.My.MySettings')
        self.data = {}
        for site in sites: 
            apps = site.findall('setting')
            for app in apps:
                self.data[app.get('name')] = app.find('value').text


class ConnectATWS():
    def __init__(self):
        #Connect to server with the credentials
        app_config = Init()
        self.username = app_config.data["Username"]
        self.password = app_config.data["Password"]
        self.login_id = app_config.data["LoginID"]
        self.url = app_config.data["AutotaskUpdateTicketEstimatedHours_net_autotask_webservices5_ATWS"]
        strQuery = """
    <queryxml>
        <entity>Ticket</entity>
        <query>
            <condition>
                <field>Id
                    <expression op="GreaterThan">0</expression>
                </field>
            </condition>
            <condition>
                <field>Status
                    <expression op="NotEqual">5</expression>
                </field>
            </condition>
            <condition>
                <field>EstimatedHours
                    <expression op="IsNull"></expression>
                </field>
            </condition>
        </query>
    </queryxml>"""

        client = Client(self.url + "?WSDL", username=self.login_id, password=self.password)
        #obj = client.factory.create('ATWSResponse')
        response = client.service.query(strQuery)

        if response.ReturnCode != 1:
            print "Error code: %s" % response.ReturnCode
            print "Error response: %s" % response.Errors
            sys.exit(1)
        else:
            os.system("clear")
            print "Query successful..."
            print "============================="
            print response.EntityResults



if __name__ == '__main__':
    handler = ConnectATWS() 

您是否粘贴了所有代码?我不知道它是如何工作的,一开始你从来没有定义 Init() 所以当你尝试实例化你的 class 时它应该出错。我也看不到您在哪里向 appconfig.data 词典添加信息。

无论如何,这是我今天一直在使用的一些示例代码

#! /usr/bin/env python

import sys
import os
from suds.client import Client

at_username = "foo@bar.com"
at_password = "foobar"

at_url = "https://webservices4.autotask.net/atservices/1.5/atws.wsdl"

def main():
    client = Client(at_url, username=at_username, password=at_password)           # Instatiate a suds.client.Client instance and connect to webservices URL

    q = """
    <queryxml>
        <entity>Ticket</entity>
        <query>
            <condition>
                <field>Id
                    <expression op="GreaterThan">0</expression>
                </field>
            </condition>
            <condition>
                <field>Status
                    <expression op="NotEqual">5</expression>
                </field>
            </condition>
            <condition>
                <field>EstimatedHours
                    <expression op="IsNull"></expression>
                </field>
            </condition>
        </query>
    </queryxml>"""

    # Status value '5' == Complete

    response = client.service.query(q)

    if response.ReturnCode != 1:
        print "Error code: %s" % response.ReturnCode
        print "Error response: %s" % response.Errors
        sys.exit(1)
    else:
        os.system("clear")
        print "Query successful..."
        print "============================="
        print response.EntityResults


main()