ApiPost 中配置自动获取 Token 并调用业务接口完整指南

发布时间:2026/7/22 23:40:45
ApiPost 中配置自动获取 Token 并调用业务接口完整指南 ApiPost 中配置自动获取 Token 并调用业务接口完整指南一、目标在 ApiPost 中实现每次发送业务请求时自动判断 Token 是否过期过期则自动调用认证接口获取新 Token无需手动操作。二、整体流程点击发送业务请求 ↓ 全局预执行脚本自动运行 ↓ 检查环境变量中 token 是否存在且未过期 ↓ 过期/为空 → 自动调用认证接口 → 解析响应 → 存入环境变量 未过期 → 跳过使用缓存 token ↓ 全局 Header 自动拼装 Authorization: Bearer {{token}} ↓ 业务请求正常发送注博客https://blog.csdn.net/badao_liumang_qizhi三、配置步骤3.1 配置环境变量位置右上角「环境管理」→ 新建/选择环境添加以下变量初始值留空变量名初始值说明base_urlhttp://127.0.0.1:8080本地服务地址token空脚本自动填充token_time空记录获取时间用于过期判断3.2 配置全局请求头位置全局参数 → Header 标签页添加一条参数名参数值AuthorizationBearer {{token}}{{token}}是环境变量的引用语法ApiPost 会在发送时自动替换为实际值。3.3 配置全局预执行脚本位置全局参数 → 预执行脚本Pre-request Script标签页四、预执行脚本通用模板4.1 OAuth2 Password Grant 模式适用于通过 OAuth2 认证服务获取 Token 的场景。// 配置区域替换为你的实际值varAUTH_URLhttps://your-auth-server.com/oauth/token;varCLIENT_IDyour_client_id;varCLIENT_PASSWORDyour_client_password;varUSERNAMEyour_username;varPASSWORDyour_password;varTOKEN_EXPIRE_MS14400000;// token 有效期毫秒此处为 4 小时// 配置区域结束 lettokenapt.variables.get(token);lettokenTimeapt.variables.get(token_time);letnowDate.now();// 判断 token 是否存在且未过期if(!token||!tokenTime||(now-Number(tokenTime))TOKEN_EXPIRE_MS){letbase64btoa(CLIENT_ID:CLIENT_PASSWORD);apt.sendRequest({url:AUTH_URL,method:POST,header:{Content-Type:application/x-www-form-urlencoded,Authorization:Basic base64},body:{mode:urlencoded,urlencoded:[{key:grant_type,value:password},{key:username,value:USERNAME},{key:password,value:PASSWORD}]}},function(err,res){if(err){console.log(获取token失败: err);return;}// 兼容多种响应格式解析letdata;try{if(res.jsontypeofres.jsonfunction){datares.json();}elseif(res.body){dataJSON.parse(res.body);}elseif(res.texttypeofres.textfunction){dataJSON.parse(res.text());}elseif(typeofresstring){dataJSON.parse(res);}else{datares;}}catch(e){console.log(解析响应失败: e.message);console.log(原始响应: String(res));return;}if(datadata.access_token){apt.variables.set(token,data.access_token);apt.variables.set(token_time,String(Date.now()));console.log(Token已自动刷新);}else{console.log(响应中没有access_token: JSON.stringify(data).substring(0,200));}});}4.2 普通登录接口模式适用于通过常规登录接口POST JSON body获取 Token 的场景。// 配置区域 varLOGIN_URLhttps://your-server.com/api/login;varLOGIN_BODY{username:your_username,password:your_password};// token 在响应中的路径如 data.token 或 data.access_tokenvarTOKEN_FIELDdata.token;varTOKEN_EXPIRE_MS7200000;// 2 小时// 配置区域结束 lettokenapt.variables.get(token);lettokenTimeapt.variables.get(token_time);letnowDate.now();if(!token||!tokenTime||(now-Number(tokenTime))TOKEN_EXPIRE_MS){apt.sendRequest({url:LOGIN_URL,method:POST,header:{Content-Type:application/json},body:{mode:raw,raw:JSON.stringify(LOGIN_BODY)}},function(err,res){if(err){console.log(登录失败: err);return;}letdata;try{if(res.jsontypeofres.jsonfunction){datares.json();}elseif(res.body){dataJSON.parse(res.body);}elseif(typeofresstring){dataJSON.parse(res);}else{datares;}}catch(e){console.log(解析失败: e.message);return;}// 按路径提取 token支持 data.token 这种嵌套路径lettokenValueTOKEN_FIELD.split(.).reduce(function(obj,key){returnobj?obj[key]:null;},data);if(tokenValue){apt.variables.set(token,tokenValue);apt.variables.set(token_time,String(Date.now()));console.log(Token已自动刷新);}else{console.log(找不到token字段: JSON.stringify(data).substring(0,200));}});}4.3 从 Set-Cookie 中提取 Token适用于登录后 Token 放在响应头 Cookie 中的场景。// 配置区域 varLOGIN_URLhttps://your-server.com/login;varLOGIN_BODY{username:your_username,password:your_password};varCOOKIE_NAMEyour_jwt_cookie_name;// 如 coc_jwt、session_token 等varTOKEN_EXPIRE_MS7200000;// 配置区域结束 lettokenapt.variables.get(token);lettokenTimeapt.variables.get(token_time);letnowDate.now();if(!token||!tokenTime||(now-Number(tokenTime))TOKEN_EXPIRE_MS){apt.sendRequest({url:LOGIN_URL,method:POST,header:{Content-Type:application/json},body:{mode:raw,raw:JSON.stringify(LOGIN_BODY)}},function(err,res){if(err){console.log(登录失败: err);return;}// 从响应头中提取 Set-Cookieletcookies;if(res.headers){// headers 可能是数组或对象if(Array.isArray(res.headers)){res.headers.forEach(function(h){if(h.keyh.key.toLowerCase()set-cookie){cookiesh.value;;}});}elseif(res.headers[set-cookie]){cookiesres.headers[set-cookie];}elseif(res.headers[Set-Cookie]){cookiesres.headers[Set-Cookie];}}// 正则提取指定 cookie 的值letregexnewRegExp(COOKIE_NAME([^;]));letmatchcookies.match(regex);if(matchmatch[1]){apt.variables.set(token,match[1]);apt.variables.set(token_time,String(Date.now()));console.log(Token已从Cookie中提取并刷新);}else{console.log(Cookie中未找到COOKIE_NAME);console.log(实际Cookie: cookies.substring(0,200));}});}五、脚本关键 API 说明5.1 全局对象兼容性ApiPost 版本全局对象说明ApiPost 7apt新版本推荐使用ApiPost 旧版pm兼容 Postman 风格如果apt报错就换pm反之亦然。5.2 核心 APIAPI作用apt.variables.get(key)获取环境变量apt.variables.set(key, value)设置环境变量apt.sendRequest(options, callback)在脚本中发送 HTTP 请求btoa(string)Base64 编码用于 Basic Authconsole.log(msg)控制台输出调试信息5.3 sendRequest 参数结构apt.sendRequest({url:完整URL,method:POST,// GET / POST / PUT / DELETEheader:{// 请求头对象格式Content-Type:application/json,Authorization:Basic xxx},body:{mode:urlencoded,// urlencoded | raw | formdataurlencoded:[// mode 为 urlencoded 时{key:name,value:value}],raw:{key:val}// mode 为 raw 时}},function(err,res){// err: 错误信息成功时为 null// res: 响应对象});5.4 响应解析兼容写法由于不同版本res的结构不同推荐使用兼容写法letdata;try{if(res.jsontypeofres.jsonfunction){datares.json();// 方式1: res.json()}elseif(res.body){dataJSON.parse(res.body);// 方式2: res.body 是字符串}elseif(res.texttypeofres.textfunction){dataJSON.parse(res.text());// 方式3: res.text()}elseif(typeofresstring){dataJSON.parse(res);// 方式4: res 直接是字符串}else{datares;// 方式5: res 本身就是对象}}catch(e){console.log(解析失败: e.message);}六、调试技巧6.1 查看脚本控制台输出发送请求后在 ApiPost 底部找到控制台Console面板查看console.log的输出。6.2 调试响应结构如果不确定res的实际结构先加上console.log(响应类型: typeofres);console.log(响应内容: JSON.stringify(res).substring(0,300));根据打印结果确定正确的解析方式。6.3 强制刷新 Token手动清空环境变量中的token值下次发送请求时脚本会重新获取。七、业务接口配置示例配置好全局脚本和 Header 后新建业务接口只需关注业务本身URL{{base_url}}/api/your-endpointMethodPOSTBodyraw JSON{pageNum:1,pageSize:10}不需要手动填写 Authorization全局配置会自动处理。八、常见问题问题原因解决Unexpected token u in JSON at position 0res是 undefined 或解析方式不对用兼容写法逐个尝试先打印typeof resapt is not defined版本不支持 apt换成pmbtoa is not defined环境不支持 btoa用Buffer.from(str).toString(base64)替代Token 获取成功但接口仍 401Header 没生效检查全局 Header 是否写了Bearer {{token}}注意空格每次都重新获取 Tokentoken_time变量没设置上检查变量名拼写确认apt.variables.set可用认证接口返回 401client_id 或密码错误单独新建一个接口手动测试认证地址是否可达九、方案对比方案优点缺点适用场景全局预执行脚本全自动一次配置永久生效需要版本支持 sendRequest日常开发首选单独 Token 接口 后执行脚本所有版本都支持过期后需手动点一次版本不支持 sendRequestbat 脚本复制到剪贴板零配置每次手动操作临时使用