我尝试使用suds进行Service Now查询,但我无法弄清楚如何指定日期范围。这是我的代码,它适用于返回具有确切日期的记录:
from suds.client import Client
URL = 'https://blah.service-now.com/change_request.do?WSDL'
USERNAME = "blah"
PASSWORD = "blah"
client = Client(URL, username=USERNAME, password=PASSWORD)
result = client.service.getRecords(start_date = "2015-02-03 12:00:00")
print result
打印结果为我提供了与确切日期时间匹配的单个记录。
当我尝试start_date> =或start_date =>或者start_date>,他们都说"语法无效"或" NameError:name' start_date'未定义"。
我如何" getRecords"一段时间?
答案 0 :(得分:1)
请记住,您基本上只是使用suds来构造SOAP有效负载。它有助于退一步并确定获取您正在寻找的响应所需的SOAP请求。
根据WSDL,start_date字段接受单个参数,其行为类似于blah = foo,因此无法在该参数中指定范围:
<xsd:element maxOccurs="1" minOccurs="0" name="start_date" type="xsd:string"/>
您可能需要的是特殊的“__encoded_query”参数,该参数接受您可以使用ServiceNow Web应用程序中的过滤器构建器UI构建的编码查询字符串:
<xsd:element maxOccurs="1" minOccurs="0" name="__encoded_query" type="xsd:string"/>
假设您要查询具有2014年10月份开始日期的所有change_request记录。转到目标ServiceNow实例(或任何一个,实际上,因为编码的查询将是相同的),并在/change_request_list.do上构建过滤器:
现在,右键单击该蓝色过滤器并选择“复制查询”以获取编码查询:
这是我生成的编码查询:
start_dateBETWEENjavascript:gs.dateGenerate('2014-10-01','00:00:00')@javascript:gs.dateGenerate('2014-10-31','23:59:59')
现在,将其作为__encoded_query
参数传递,其有效负载如下所示:
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<getRecords xmlns="http://www.service-now.com/change_request">
<__encoded_query xmlns="">start_dateBETWEENjavascript:gs.dateGenerate('2014-10-01','00:00:00')@javascript:gs.dateGenerate('2014-10-31','23:59:59')</__encoded_query>
</getRecords>
</Body>
</Envelope>
因此,要使suds工作,只需将start_date
查询替换为__encoded_query
查询:
from suds.client import Client
URL = 'http://localhost:8080/change_request.do?WSDL'
USERNAME = "admin"
PASSWORD = "admin"
client = Client(URL, username=USERNAME, password=PASSWORD)
result = client.service.getRecords(__encoded_query = "start_dateBETWEENjavascript:gs.dateGenerate('2014-10-01','00:00:00')@javascript:gs.dateGenerate('2014-10-31','23:59:59')")
print result