ServiceNow REST API查询CMDB服务器CI分页失效及名称筛选失败问题咨询
ServiceNow CMDB API拉取问题修复方案
分页拉取全量数据修复
原有代码的分页参数为无效的硬编码写法,且未实现循环拉取逻辑。ServiceNow REST API单页默认最大返回1000条记录,你可以通过循环累加偏移量的方式拉取全量数据:
- 单页请求固定设置
sysparm_limit=1000达到单页返回上限,减少请求次数 - 每次请求后偏移量
sysparm_offset增加1000,直到接口返回的结果条数小于1000,即可停止分页拉取
CI名称过滤功能修复
名称查询功能失效的核心是参数拼接逻辑错误,sysparm_query参数需要和分页参数同时存在时,用&符号拼接即可,精确匹配用name=目标名称,模糊匹配用nameLIKE目标关键词,如果名称包含特殊字符需要做URL编码处理。
修复后可运行代码
import requests from urllib.parse import quote # 配置认证信息,此处替换为你自己的账号密码 user = "你的账号" pwd = "你的密码" def class_data(filter_name=None): class_data = [] # CI Class classes = ["cmdb_ci_win_server", "cmdb_ci_linux_server"] # 单页最大拉取条数 page_limit = 1000 # 设置请求头 headers = {"Accept": "application/json"} for class_id in classes: offset = 0 while True: # 拼接基础参数 params = [ f"sysparm_limit={page_limit}", f"sysparm_offset={offset}" ] # 如果有名称过滤条件,追加查询参数 if filter_name: # 对查询值做URL编码避免特殊字符报错 encoded_name = quote(filter_name) # 精确匹配写法,需要模糊匹配改为f"sysparm_query=nameLIKE{encoded_name}"即可 params.append(f"sysparm_query=name={encoded_name}") # 拼接完整请求URL param_str = "&".join(params) url = f"https://sparc.service-now.com/api/now/cmdb/instance/{class_id}?{param_str}" # 发起请求 response = requests.get(url, auth=(user, pwd), headers=headers) if response.status_code != 200: print('Status:', response.status_code, 'Headers:', response.headers, 'Error Response:', response.content) exit() res_data = response.json()['result'] class_data.extend(res_data) # 如果返回结果小于单页上限,说明已经拉完当前类的所有数据,跳出分页循环 if len(res_data) < page_limit: break # 偏移量累加进入下一页 offset += page_limit return class_data # 调用示例:拉取所有服务器数据 # all_servers = class_data() # 调用示例:仅查询名称为server1的服务器 # target_server = class_data(filter_name="server1")
内容的提问来源于stack exchange,提问作者Rio
相关产品推荐
相关产品推荐

