Apifox 发请求时如何自动获取Cookie 和 token

Apifox 发请求时如何自动获取Cookie 和 token

用户登录到网站或 App 是非常常见的的场景,登录成功后一般会返回登录凭证(一般为 Cookie 或者 token),后续其它接口发起请求时会携带 Cookie 或者 token 到服务器进行校验。校验通过,则返回相关的数据,否则报错或者要求用户去登录。

那么,在 Apifox 中,我们如何设置登录态(Authorization),并且在调用接口的时候自动获取 Cookie 或者 token 呢?

前期准备

首先你需要准备两条接口:

  1. 一条接口用于获取登录凭证(即 Cookie 或者 token 的值);
  2. 另一条接口通过 Cookie 或 token 的值发送到服务器进行校验。

你也可以通过 Apifox 提供的两条接口来进行相关测试,接口如下:

  • 一是邮箱登录接口 https://api.apifox.cn/api/v1/login?locale=zh-CN,该接口用来获取登录后的 token。
  • 二是项目列表接口 https://api.apifox.cn/api/v1/user-projects?locale=zh-CN,该接口用来测试登录后返回的 token 是否有效。
如果你要用上面的两条接口,那么你需要确保你的 Apifox 账户设置了密码并绑定了邮箱。
Apifox 发请求时自动获取Cookie 和 token

手动登录获取

本章节我们来讨论手动登录的方式:先进行手动登录,然后再通过登录后获取到的 Cookie 和 token 的信息调用其它接口。

在任一目录下新建一个POST请求,可在页面底部选择调试模式,然后填写请求路径,设置请求体 Body,选择请求体的格式,并填写登录需要的用户名及密码,具体如下所示:

Apifox 发请求时自动获取Cookie 和 token
注:如果你用的是 Apifox 提供的接口,上面请求体中的字段说明如下:
  • "account":你的 Apifox 登录邮箱
  • "password": 你的 Apifox 登录密码
  • "loginType": "EmailPassword"。默认字段,照写即可。

完成上面的步骤后,可设置后置操作,将返回的 Cookie 或 token 存到 环境变量 中。如下图所示,设置变量名称以及 JSONPath 表达式。

Apifox 发请求时自动获取Cookie 和 token
注:$.data.accessToken 中的 accessToken 字段就是服务器返回的 token,如果你用的是自己的接口,字段名可能会不一样。

相关的操作设置完成,即可发起请求,请求结果如下图所示。其中字段accessToken的值保存到了环境变量中(你可在环境变量中查看),Cookie 值相应的也自动保存。

Apifox 发请求时自动获取Cookie 和 token

当 2.1 小节的 token 获取成功,用其它接口发起请求的时候,即可携带 token 信息一起发给后台,其中相关的 Cookie 信息会自动带上。

你可以在 Header 里设置 Authorization,并获取 环境变量 中的 token 值来发起请求:

Apifox 发请求时自动获取Cookie 和 token

或者直接把 token 值写进去:

Apifox 发请求时自动获取Cookie 和 token

也可以在 Auth 里设置授权信息:

注:通过 Bearer Token 的授权方式,如果你的环境变量中的值有前缀 Bearer,需要先将其删除。
Apifox 发请求时自动获取Cookie 和 token

前置脚本自动获取

手动登录的方式有时过于繁琐,为了更方便的调用接口,我们通过 前置脚本 来实现自动登录。其目的就是通过 JavaScript 脚本的方式来先调用登录接口,然后将登录接口返回的 token 值自动存到环境变量中,这样在每次发起请求之前,都会获取到最新的 token 凭证,省去了在 token 过期时需要手动更新的麻烦(脚本要写在“前置操作”中)。

具体的实现步骤如下:

1、在环境变量中新增一个变量(如:ACCESS_TOKEN),该变量用来保存登录需要的凭证(即token值)。如果凭证有过期时间,也可新增一个变量(如:ACCESS_TOKEN_EXPIRES)用来保存登录凭证的过期时间。

Apifox 发请求时自动获取Cookie 和 token

2、在项目的根目录或任一目录的前置操作中,新增一个自定义脚本(脚本为 JavaScript 代码),自定义内容如下(这里的脚本你需要根据你的业务来调整,本质上就是一段前端代码):

注:如果你的 token 没有过期时间,可以将 ACCESS_TOKEN_EXPIRES 相关的代码去除。
// 获取环境变量里的 ACCESS_TOKEN
const accessToken = pm.environment.get("ACCESS_TOKEN");

// 获取环境变量里的 ACCESS_TOKEN_EXPIRES
// const accessTokenExpires = pm.environment.get("ACCESS_TOKEN_EXPIRES");

// 如 ACCESS_TOKEN 没有值,或 ACCESS_TOKEN_EXPIRES 已过期,则执行发送登录接口请求
if (
    //   !accessToken ||
    //   (accessTokenExpires && new Date(accessTokenExpires) <= new Date())
    !accessToken
) {
    sendLoginRequest();
}

// 定义发送登录接口请求方法
function sendLoginRequest() {
    // 获取环境里的 前置 URL
    const baseUrl = pm.request.getBaseUrl();

    // 登录用户名,这里从环境变量 LOGIN_USERNAME 获取,也可以写死
    // const username = pm.environment.get("LOGIN_USERNAME");

    // 登录密码,这里从环境变量 LOGIN_PASSWORD 获取,也可以写死
    // const password = pm.environment.get("LOGIN_PASSWORD");

    // 构造一个 POST json 格式请求。这里需要改成你们实际登录接口的请求参数。
    const loginRequest = {
        // url: baseUrl + "/api/v1/login",
        url: "https://api.apifox.cn/api/v1/login",
        method: "POST",
        
        // body 为 json 格式
        header: {
            "Content-Type": "application/json", // 注意:header 需要加上 Content-Type
        },
        body: {
            // 此处为 raw
            mode: 'raw',
            // 序列化后的 json 字符串
            raw: JSON.stringify(
                {
                    "account": "url接口需要的有效用户名",// 该字段可替换成你接口的字段
                    "password": "url接口需要的有效密码",// 该字段可替换成你接口的字段
                    "loginType": "EmailPassword",// 接口中不需要该字段可移除
                }
            ), 
        }
        
         // body 为 x-www-form-urlencoded 格式
         /*
         body: {
           mode: "urlencoded", // 此处为 urlencoded
           // 此处为 urlencoded
           urlencoded: [
             { key: "account", value: "apifox" },
             { key: "password", value: "123456" },
           ],
         },
         */
        
        
        // body 为 form-data 格式
        /*
        body: {
          mode: 'formdata', // 此处为 formdata
          // 此处为 formdata
          formdata: [
            { key: 'account', value: 'apifox' },
            { key: 'password', value: '123456' }
          ]
        }
        */
    
        // body 为 raw 或 json 格式
        /*
        body: {
          mode: 'raw',
          raw: '此处为 body 内容',
        }
        */
    };

    // 发送请求。
    // pm.sendrequest 参考文档: https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-sendrequest
    pm.sendRequest(loginRequest, function (err, res) {
        if (err) {
            console.log(err);
        } else {
            // 读取接口返回的 json 数据。
            // 如果你的 token 信息是存放在 cookie 的,可以使用 res.cookies.get('token') 方式获取。
            // cookies 参考文档:https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-cookies
            const jsonData = res.json();
            
            // 将 accessToken 写入环境变量 ACCESS_TOKEN
            pm.environment.set("ACCESS_TOKEN", jsonData.data.accessToken);
            
            // 将 accessTokenExpires 过期时间写入环境变量 ACCESS_TOKEN_EXPIRES
            // pm.environment.set(
            //     "ACCESS_TOKEN_EXPIRES",
            //     jsonData.data.accessTokenExpires
            // );
        }
    });
}

3、前置脚本设置完成,当你去通过其它接口发起请求的时候,把存储在环境变量中的登录凭证添加到请求头即可成功发起请求。

Apifox 发请求时自动获取Cookie 和 token

总结

以上就是通过 Apifox 发起请求时获取Cookie 和 token 的方法,你可以先手动登录,获取到登录凭证后再发起请求;也可以通过设置 前置脚本 的方式自动获取登录凭证并发起请求。想要了解更多相关的知识,比如接口的导入、Mock数据和自动化测试等功能,可以访问 Apifox 的帮助文档

订阅
qrcode

订阅

随时随地获取 Apifox 最新动态