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

ServiceNow Scripted Rest API重定向失效问题技术求助

Scripted REST API重定向失效问题修复方案

问题说明

我创建了一个GET方法的Scripted REST API,输入参数为事件编号(incident number),生成目标URL后需要重定向到该地址,但重定向功能无法正常运行,请求技术指导。

原始代码

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

// implement resource here  
var redirectLink, incidentShortDesc;
var instanceURL = gs.getProperty('glide.servlet.uri', '');
var targetURL = instanceURL+'/now/sow/record/incident/';
gs.addInfoMessage(instanceURL);
var pathParams = request.pathParams;    


var number = pathParams.number;
gs.addInfoMessage(number);
var incident_Array = [];

var gr = new GlideRecord('incident');   
gr.addQuery('number',number);
gr.query();

while(gr.next()) {
    var obj = {};
    var sys_id = gr.getValue('sys_id');
    var redirect_url = targetURL+sys_id;
    obj.sys_id = gr.getValue('sys_id');
    obj.number = gr.getValue('number');
    obj.short_description = gr.getValue('short_description');
    obj.description = gr.getValue('description');
    obj.location = gr.getDisplayValue('location');
    obj.state = gr.getDisplayValue('state');
    obj.url=redirect_url;
    incident_Array.push(obj);       
}
response.setBody(incident_Array);

this.response.sendRedirect(redirect_url);

if (!gs.isLoggedIn()) {
    redirectLink = redirect_url + sys_id;
    gs.addErrorMessage('Please login and try your request again.');
    //Redirect the user to the login page.
    redirectTo(response, redirectLink);
    return;
}


redirectLink = redirect_url + sys_id;
gs.addInfoMessage('A new Incident has been generated. You have been redirected to the new Incident record. ');
redirectTo(response, redirectLink);

function redirectTo(response, redirectURL) {
    response.setHeader(
        "Cache-Control",
        "no-cache,no-store,must-revalidate,max-age=-1"
    );
    response.setHeader(
        "Pragma",
        "no-store,no-cache"
    );
    //This doesn't really matter, but the redirect may sometimes fail without this header.
    response.setHeader(
        "Expires",
        "Thu, 01 Jan 1970 00:00:00"
    );
    response.setStatus(301); //301 = Redirect
    response.setLocation(redirectURL);
    
    return true;
}
})(request, response);

问题排查

原始代码存在多个导致重定向失效的问题:

  • 响应体与重定向冲突:先调用response.setBody(incident_Array)发送JSON响应体,之后再设置重定向头时,响应已经开始传输,重定向指令会被忽略。
  • 变量作用域错误:redirect_url和sys_id定义在while循环内部,若未找到事件或循环结束后,变量可能未定义;且事件编号唯一,用while循环没必要,改用if(gr.next())更合理。
  • URL拼接重复:redirectLink = redirect_url + sys_id中,redirect_url已经是targetURL+sys_id,重复拼接会导致URL格式错误(如xxx/incident/sysid123sysid123)。
  • 逻辑顺序混乱:先执行了重定向相关代码,之后才判断登录状态,导致登录校验逻辑失效,且多次调用重定向方法产生冲突。
  • 错误的重定向方法调用:this.response.sendRedirect(redirect_url)使用了错误的response对象,应该直接用传入的response参数。
  • 状态码选择不当:301是永久重定向,动态跳转场景更适合用302临时重定向。

修复后的代码

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
    var instanceURL = gs.getProperty('glide.servlet.uri', '');
    var targetURL = instanceURL + '/now/sow/record/incident/';
    var pathParams = request.pathParams;
    var number = pathParams.number;

    // 先校验登录状态
    if (!gs.isLoggedIn()) {
        gs.addErrorMessage('请登录后重试');
        // 重定向到登录页,登录后跳转回目标地址
        var loginRedirect = instanceURL + '/login.do?redirect=' + encodeURIComponent(targetURL);
        redirectTo(response, loginRedirect);
        return;
    }

    // 查询事件记录
    var gr = new GlideRecord('incident');
    gr.addQuery('number', number);
    gr.query();

    if (gr.next()) {
        var sys_id = gr.getValue('sys_id');
        var redirect_url = targetURL + sys_id;
        gs.addInfoMessage('已跳转到事件记录页面');
        redirectTo(response, redirect_url);
    } else {
        // 未找到对应事件,返回404
        response.setStatus(404);
        response.setBody({error: '未找到编号为' + number + '的事件'});
        return;
    }

    function redirectTo(response, redirectURL) {
        response.setHeader("Cache-Control", "no-cache,no-store,must-revalidate,max-age=-1");
        response.setHeader("Pragma", "no-store,no-cache");
        response.setHeader("Expires", "Thu, 01 Jan 1970 00:00:00");
        response.setStatus(302); // 临时重定向,更适合动态场景
        response.setLocation(redirectURL);
        return true;
    }
})(request, response);

关键修复点说明

  • 移除了response.setBody(incident_Array):REST API重定向时不能同时返回JSON体,二者只能选其一;若需要返回事件数据,应放弃重定向,直接返回JSON。
  • 调整逻辑顺序:先校验登录状态,再查询事件,最后执行重定向,避免逻辑冲突。
  • 修正变量作用域:将sys_id和redirect_url放在if(gr.next())内部,确保只有找到事件时才生成有效URL。
  • 修复URL拼接错误:去掉重复的sys_id拼接,保证URL格式正确。
  • 替换状态码为302:符合动态跳转的场景需求,避免浏览器缓存重定向地址。
  • 优化登录重定向:添加登录后跳转回目标地址的参数,提升用户体验。
  • 增加未找到事件的处理:返回404状态码和错误信息,避免无意义的重定向。

内容的提问来源于stack exchange,提问作者user3321757

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:15:13