1. 报错(400或415)

前端代码:

export function refreshToken(token) {
  return ajax({
    url: "/api/user/refreshToken",
    method: "post",
    data: { token },
  })
}

后端代码:

public ActionResult RefreshToken(string jwt)
{
    //接口内容
}

2. 分析

(1). 前端发送和后端接收的数据类型要一致

上述代码 token 为字符串,data 是 token 强行封装的对象,而后端接口参数是字符串类型,所以产生400错误。

(2). 前端发送的内容类型有时要手动指定

Axios发送字符串数据时,headers 默认的 Content-Type 为 “application/x-www-form-urlencoded”,需要指定为 “application/json”。否则可能产生415错误。

(3). 基本类型参数的接收要指定参数特性

开启默认推理规则时(不指定参数特性时),对于基本类型(例如string)的参数,不能推理出去哪里接收,需要显示指定参数特性为[FromForm] 或者 [FromBody] 等等。否则可能产生400错误。

3. 修复

方案一

前端代码:

export function refreshToken(token) {
  return ajax({
    url: "/api/user/refreshToken",
    method: "post",
    data: token,
    headers: { "Content-Type": "application/json" },
  })
}

后端代码:

public ActionResult RefreshToken([FromBody] string jwt)
{
    //接口内容
}
方案二

前端代码:

export function refreshToken(token) {
  return ajax({
    url: "/api/user/refreshToken",
    method: "post",
    data: { "token":token },
  })
}

后端代码:

public ActionResult RefreshToken(JwtReq jwt)
{
    //接口内容
}
public class JwtReq
{
    public string Token { get; set; }
}

4. 总结

满足上述分析的三点可以避免一部分此类错误。

对于 get 方式或者用 params 传参的情况,原则同上。

本文仅供参考,未必能解决所有相似问题。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐