如何通过REST API在ServiceNow中发布出版物并触发通知邮件
问题原因
你直接通过REST API更新sn_publications_publication表stage字段后未触发邮件,核心原因是UI端的出版物推送操作不是单纯修改stage字段值:点击UI上的推送按钮时,除了修改stage字段,还会同步执行订阅用户匹配、通知规则触发、邮件队列生成的关联逻辑,这部分逻辑没有绑定在stage字段更新的数据库操作事件上,直接通过Table API修改字段值不会触发这部分执行链路,自然不会发邮件。
可落地的实现方案
优先选第一种方案,和UI操作逻辑完全一致,不会出现逻辑漏执行的问题:
- 方案1:复用内置出版物服务逻辑,自定义REST接口实现推送
- 先定位UI端推送按钮的核心逻辑:打开
sn_publications_publication表的表单配置,找到对应「推送至Review阶段/发送给订阅用户」的UI Action,查看其Script字段内的执行代码,找到内置的发送调用方法(一般出版物模块会调用sn_publications.PublicationService类下的阶段流转/发送方法,方法名、参数以你实例里的实际代码为准) - 新建一个Scripted REST API,在接口脚本里直接复用UI Action里的核心发送逻辑,示例代码如下:
(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) { // 从请求路径里获取要推送的出版物Sys ID var pubId = request.pathParams.publication_sid; var pubGr = new GlideRecord('sn_publications_publication'); if (!pubGr.get(pubId)) { response.setStatus(404); response.setBody({code:404, msg:"指定出版物不存在"}); return; } // 以下调用和UI Action里的核心逻辑保持完全一致 var pubService = new sn_publications.PublicationService(); var execResult = pubService.moveToStage(pubGr, 'review'); response.setBody({code:200, success:execResult, pub_id:pubId}); })(request, response);- 给这个自定义REST接口配置好权限后,直接调用该接口传入出版物ID即可完成推送,会自动触发邮件发送、订阅用户推送全链路逻辑,和UI手动操作效果完全一致。
- 先定位UI端推送按钮的核心逻辑:打开
- 方案2:直接调用原生Table API(仅适用于发送逻辑绑定在字段更新业务规则上的场景)
如果你确认发送通知的逻辑是绑定在stage字段更新的业务规则/Flow上,而非写在UI Action里,可以直接调用原生Table API更新记录,注意以下要求:- 请求地址格式:
https://<你的实例域名>/api/now/table/sn_publications_publication/<出版物Sys ID> - 请求方法用PUT,请求体传
{"stage":"Review"}即可 - 不要在请求参数里加
sysparm_execute_business_rules=false,不要加跳过业务规则、跳过审计的相关请求头,确保API调用时业务规则正常执行 - 调用账号需要拥有
sn_publications_publication表的写权限、出版物发送的对应操作权限
- 请求地址格式:
验证步骤
- 调用接口后,先在UI端确认对应出版物的stage字段已正确更新为Review
- 进入系统邮箱的已发送队列,检查对应出版物的通知邮件是否已正常生成
- 用测试订阅账号登录,确认能正常收到通知、看到对应推送的出版物
内容的提问来源于stack exchange,提问作者toni
相关产品推荐
相关产品推荐

