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
相关产品推荐
相关产品推荐

