Axios带Headers的请求方式

适用场景:前后端分离项目,接口需要身份认证,一般通过 Token 放在请求头 headers 传递给后端校验。

说明

  • Token 放在请求头(headers)中,不属于请求体 data,也不属于url参数 params
  • 后端从 Request.Headers 读取自定义请求头(如TOKEN、USERID)完成身份校验
  • 这是前后端分离项目最常用的认证方案

前端完整HTML代码

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>例子</title>
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script src="~/Scripts/axios.js"></script>
</head>
<body>
    <div id="name"></div>
    <script>
        $(function () {
            let data = {
                ID: 123
            },
            headers = {
               USERID: "",
               TOKEN: "123343444"
            };

            axios({
                method: 'post',
                url: '/home/user',
                // 请求体参数
                data: data,
                // 设置自定义请求头,携带token认证信息
                headers: headers,
                responseType: 'json'
            }).then(response => {
                // 请求成功
                let res = response.data;
                $("#name").text(res.user + res.token);
            }).catch(error => {
                // 请求失败
                console.log(error);
            });
        });
    </script>
</body>
</html>
Code language: HTML, XML (xml)

ASP.NET MVC 后端代码

[HttpPost]
public ActionResult User(int id)
{
    // 从请求头中读取前端传过来的TOKEN
    var token = Request.Headers["TOKEN"];
    return Json(new { user = "bamn.cn:" + id, token = token }, JsonRequestBehavior.AllowGet);
}
Code language: PHP (php)

后端查看所有请求头

Request.Headers.AllKeys 可以拿到全部请求头集合,示例:

[0]: "Connection"
[1]: "Content-Length"
[2]: "Content-Type"
[3]: "Accept"
[4]: "Accept-Encoding"
[5]: "Accept-Language"
[6]: "Cookie"
[7]: "Host"
[8]: "Referer"
[9]: "User-Agent"
[10]: "USERID"
[11]: "TOKEN"  // 我们自定义的header
[12]: "Origin"
[13]: "Sec-Fetch-Site"
[14]: "Sec-Fetch-Mode"
[15]: "Sec-Fetch-Dest"
Code language: JavaScript (javascript)

简写写法(axios.post)

let data = { ID:123 };
let headers = { TOKEN:"123343444" };
axios.post('/home/user', data, { headers: headers })
.then(res=>{
    $("#name").text(res.data.user + res.data.token);
}).catch(err=>{
    console.log(err);
})
Code language: JavaScript (javascript)

拓展知识点

  1. 全局统一设置Header(推荐) 如果所有接口都要携带token,不用每次请求单独写headers:
axios.defaults.headers.common['TOKEN'] = "123343444";
Code language: JavaScript (javascript)

设置之后,后续所有axios请求自动带上这个请求头。

  1. 常见规范:很多项目请求头字段名使用 Authorization: Bearer xxx 格式存放token
headers:{
    "Authorization":"Bearer 123343444"
}
Code language: JavaScript (javascript)
  1. 注意:自定义Header可能触发跨域预检OPTIONS请求,后端CORS需要配置允许这个自定义头,否则浏览器会拦截。

小结

  • headers:存放认证信息(token),属于请求头,不是请求参数
  • data:POST请求体业务参数
  • params:GET的url查询参数
  • 后端通过 Request.Headers["键名"] 获取自定义请求头

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注