You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:06:04