Vue 跨域 前后端处理,mock 导致requestBody接收不到

1.Vue 前端跨域配置,开发调试阶段推荐这样使用!

  devServer: {
    proxy: { // 配置跨域
      '/api': {
        target: 'http://localhost/Apis', // 这里后台的地址模拟的;应该填写你们真实的后台接口
        changOrigin: true, // 允许跨域
        pathRewrite: {
          /* 
            我们使用的时候,比如login请求:/api/login

            重写路径,当我们在浏览器中看到请求的地址为
            http://localhost:9528/api/login 时
            实际上访问的地址是:
            http://localhost/Apis/login, 记得通过'^/api': '' 把/api去掉,不然实际请求会多出一个/api,会变成http://localhost/Apis/api/login
            
            如何验证?:使用工具访问 http://localhost:8080/api/core/getData/userInfo
           */
          '^/api': ''
        }
      }
    }
  },

2.通过Vue 解决前端跨域问题,但是 post请求接收不到 requestBody?

在调试请求时,先用工具调试。如idea 自带的REST Client

后端接收到请求,提示:

Unexpected character ('t' (code 116)): was expecting double-quote to start field name

后面发现是发送的请求的key值不带冒号,所以有如下两种方式处理

@RequestBody 会把接收到的对象进行自动转换,转换的对象是你申明的对象。如下方的String,UserForm

//1.key不带冒号,可以转换为string,map解析。
loginForm = {username: "admin", password: "111111"}

@PostMapping(value = "/login")
@ResponseBody
public Result<String> loginIn(@RequestBody String loginForm) {
        Map ob= (Map) JSONObject.parse(loginForm);
        String name = (String) ob.get("username");
        String pass = (String) ob.get("password");
}


//2.key带冒号,可以直接转换对象,注意UserForm 的key要与RequestBody 的username,password保持一致
loginForm = {”username“: "admin", ”password“: "111111"}

@PostMapping(value = "/login")
@ResponseBody
public Result<String> loginIn(@RequestBody UserForm loginForm) {
        String name = loginForm.getUsername;
        String pass = loginForm.getPassword;
}




3.REST Client 直接调试通了,但是调试跨域之后的地址,还是无法接收到requestBody?

访问跨域后的地址,访问失败!

直接访问请求地址,不是访问经过跨域后的地址,成功!

先判断访问这个跨域的地址是否进入了请求,打断点发现没有进入后台post请求loginIn,难道跨域失败,不是访问实际的接口http://localhost/Apis/login,后台先把Apis/login这个接口拦截看看,是否访问了这个接口。打断点发现实际上是访问到了。

REST Client 访问跨域后的地址:

后台拦截到访问的地址:

也就是这个接口已经接收到了,放行之后,还是无法进入loginIn接口。也就是说,这个请求参数可能是不存在的。添加一个新的loginIn测试接口,测试如下:

也就是,有参数的接口是无法进入的,但是无参数的接口是可以进入的。换句话说,有参数的接口requestBody,转换为指定参数String时,出错了。验证下:

直接访问接口调试,可以进入接口,获取到requestBody。那后端是没问题,也就是Vue前端访问请求出现了问题,具体就是这个请求体。开始调试前端!

Vue 前端发送的requestBody会不会被有问题?前端有通过mock模拟ajax请求,看看mock有没有特殊操作。看相关文档,有一个地方对body进行了操作:

屏蔽截图中的代码,重新运行项目,注意是重新运行Vue项目!后台可以接收到Vue发送的post /Apis/login请求!

部署参考:https://blog.csdn.net/yys190418/article/details/107217457/

猜你喜欢

转载自blog.csdn.net/u014632228/article/details/111509842