【问题标题】:How to use Types and Methods with SUDS如何在 SUDS 中使用类型和方法
【发布时间】:2015-09-09 20:41:34
【问题描述】:

我的代码通过 SUDS 连接到 Autotask 服务。我得到一个方法列表,我必须调用其中一个。我是新手,所以我不确定如何正确执行此操作。这是我的代码,包括 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"]
        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>"""
        new_url = 'https://webservices5.autotask.net/atservices/1.5/atws.wsdl'
        client = Client(new_url, username=self.login_id, password=self.password)
        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:
            print "Query successful..."
            print "============================="
            print response.EntityResults



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

这是我的回应:

(ATWSResponse){
   ReturnCode = 1
   EntityResults = ""
   EntityResultType = "ticket"
   Errors = ""
   EntityReturnInfoResults = ""
 }

这是我通过客户端获得的方法和类型列表:

    Suds ( https://fedorahosted.org/suds/ )  version: 0.4 GA  build: R699-20100913

Service ( ATWS ) tns="http://autotask.net/ATWS/v1_5/"
   Prefixes (1)
      ns0 = "http://autotask.net/ATWS/v1_5/"
   Ports (1):
      (ATWSSoap)
         Methods (14):
            CreateAttachment(Attachment attachment, )
            DeleteAttachment(xs:long attachmentId, )
            GetAttachment(xs:long attachmentId, )
            GetFieldInfo(xs:string psObjectType, )
            GetInvoiceMarkup(xs:int InvoiceId, xs:string Format, )
            GetWsdlVersion()
            create(ArrayOfEntity Entities, )
            delete(ArrayOfEntity Entities, )
            getEntityInfo()
            getThresholdAndUsageInfo()
            getUDFInfo(xs:string psTable, )
            getZoneInfo(xs:string UserName, )
            query(xs:string sXML, )
            update(ArrayOfEntity Entities, )
         Types (108):
            ATWSError
            ATWSResponse
            ATWSZoneInfo
            Account
            AccountLocation
            AccountNote
            AccountTeam
            AccountToDo
            ActionType
            AdditionalInvoiceFieldValue
            AllocationCode
            Appointment
            ArrayOfATWSError
            ArrayOfEntity
            ArrayOfEntityInfo
            ArrayOfEntityReturnInfo
            ArrayOfField
            ArrayOfPickListValue
            ArrayOfUserDefinedField
            Attachment
            AttachmentInfo
            AutotaskIntegrations
            BillingItem
            BillingItemApprovalLevel
            ChangeRequestLink
            ClientPortalUser
            Contact
            Contract
            ContractBlock
            ContractCost
            ContractFactor
            ContractMilestone
            ContractNote
            ContractRate
            ContractRetainer
            ContractService
            ContractServiceAdjustment
            ContractServiceBundle
            ContractServiceBundleAdjustment
            ContractServiceBundleUnit
            ContractServiceUnit
            ContractTicketPurchase
            Country
            Department
            Entity
            EntityDuplicateStatus
            EntityInfo
            EntityReturnInfo
            EntityReturnInfoDatabaseAction
            ExpenseItem
            ExpenseReport
            Field
            InstalledProduct
            InstalledProductType
            InstalledProductTypeUdfAssociation
            InternalLocation
            InventoryItem
            InventoryItemSerialNumber
            InventoryLocation
            InventoryTransfer
            Invoice
            InvoiceTemplate
            Opportunity
            PaymentTerm
            Phase
            PickListValue
            Product
            ProductVendor
            Project
            ProjectCost
            ProjectNote
            PurchaseOrder
            PurchaseOrderItem
            PurchaseOrderReceive
            Quote
            QuoteItem
            QuoteLocation
            Resource
            ResourceRole
            ResourceSkill
            Role
            SalesOrder
            Service
            ServiceBundle
            ServiceBundleService
            ServiceCall
            ServiceCallTask
            ServiceCallTaskResource
            ServiceCallTicket
            ServiceCallTicketResource
            ShippingType
            Skill
            Task
            TaskNote
            TaskPredecessor
            TaskSecondaryResource
            Tax
            TaxCategory
            TaxRegion
            Ticket
            TicketChangeRequestApproval
            TicketCost
            TicketNote
            TicketSecondaryResource
            TimeEntry
            UserDefinedField
            UserDefinedFieldDefinition
            UserDefinedFieldListItem

我需要使用 ATWSResponse 类型,但我不太了解如何执行此操作。此外,我正在尝试模拟这个 vb.net 代码部分,它可以完成我在 Python 中尝试做的事情:

Sub ProcessTicket()
    Dim boolQueryFinished = False
    Dim strCurrentID As String = "0"
    Dim strQuery As String
    Dim strCriteria As String = ""
    Dim TicketArray(0) As Ticket

    While (Not (boolQueryFinished))
        If LCase(Trim(varIgnoreTicketStatus)) = "true" Then
            WriteToLog("Updating All Tickets Where EstimatedHours Is Null")
        Else
            WriteToLog("Updating Ticket Where Status <> Complete And EstimatedHours Is Null")
            ' 5 - Complete
            strCriteria = "<condition><field>Status<expression op=""NotEqual"">5</expression></field></condition>"
        End If

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

        Dim r As ATWSResponse
        Dim strLog As String

        r = ATWSService.query(strQuery)
        WriteToLog("Found " & r.EntityResults.Length & " Tickets begining at " & strCurrentID)

        If r.EntityResults.Length > 0 Then
            For Each ent As Entity In r.EntityResults
                CType(ent, Ticket).EstimatedHours = EstHoursDefault

                TicketArray(0) = CType(ent, Ticket)

                Dim sResponse As ATWSResponse
                Dim entityArray() As Entity = CType(TicketArray, Entity())
                sResponse = ATWSService.update(entityArray)

我的问题是如何使用我的 Python 代码成功查询 QueryXML 并返回像 vb.net 代码中的实体?

【问题讨论】:

  • 尝试后:response = client.service.query(strQuery) 我得到了这个:Exception: (307, u'Temporary Redirect')
  • 如何将 ATWSResponse 类型与此方法“查询”一起使用?
  • 查询失败后,能否打印出如下信息:stackoverflow.com/a/6069053/369450

标签: python vb.net python-2.7 wsdl suds


【解决方案1】:

首先,用于连接 api 的 url 不是正确的。我需要使用https://webservices5.autotask.net/atservices/1.5/atws.wsdl

一旦客户端收到响应,我必须匹配 ReturnCode 才能运行我想要的代码。返回码不能为 1(这是查询中的错误),因此我使用了:

        if response.ReturnCode != 1:
            print "Error code: %s" % response.ReturnCode
            print "Error response: %s" % response.Errors
            sys.exit(1)
        else:
            print "Query successful..."
            print "============================="
            response = response.EntityResults[0]

为了存储我返回的数据(实体),即门票,我必须执行以下循环:

            entities = []
            for entity in response:
                entities.append(dict(entity))

            for entity in entities:
                self.query_data.append(entity["Title"] + "  Estimated Hours " + str(entity["EstimatedHours"]))

这样我可以将元组列表存储在实体列表中,以便自己访问每个实体。完成此操作后,我所要做的就是将结果附加到列表 self.query_data

注意:感谢 Bodsda 帮助我弄清楚我是如何使用我的 XML 查询错误地址的,以及对循环的帮助。

【讨论】:

    【解决方案2】:

    我不确定,但除了 cpburnz 的回答之外,我注意到在似乎可以工作的 vb 代码中,python 变量 r 应该像您一样创建为 ATWSResponse客户端在 vb 中是一个名为 ATWSService 的对象。

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2019-05-20
      相关资源
      最近更新 更多