axios模拟表单提交

axios默认是application/json方式提交,controller接收的时候必须以@RequestBody的方式接收,有时候不太方便。如果axios以application/x-www-form-urlencoded方式提交数据,controller接收的时候只要保证名字应对类型正确即可。

前端代码:

javascript 复制代码
  <el-dialog
      v-model="dialogVisible" width="30%"
  >
    <el-form :model="formData" label-position="top">
      <el-form-item label="用户名">
        <el-input v-model="formData.username" placeholder="用户名..."/>
      </el-form-item>
      <el-form-item label="密码">
        <el-input type="password" v-model="formData.password" placeholder="密码..."/>
      </el-form-item>
    </el-form>
    <template v-slot:header>
      <span>登录窗口</span>
    </template>
    <template #footer>
      <span class="dialog-footer">
        <el-button type="primary" @click="formConfirm">
          登录
        </el-button>
      </span>
    </template>
  </el-dialog>

这是利用Element-Plus模态框提供的三个SLOT(footer,header和default)嵌套了一个Element-Plus的表单。点击登录按钮时,将双向绑定的formData提交到controller。

点击登录按钮时出发的formConfirm方法:

javascript 复制代码
const formConfirm=function (){
  this.dialogVisible=false;
  axios.post(url.login,formData,{
                headers: {'Content-Type': 'application/x-www-form-urlencoded'}
              }
      )
      .then(resp=>{
        const data = resp.data;
        this.formData.username="";
        this.formData.password="";
        console.log(data);
      })
      .catch(err=>{
            console.log("login error: ",err);
          }
      );
}

核心就是使用了三参数的post函数:

post(url,data,config)

config里面设定发起post请求时的额外设置,header是设置(config)的一部分,而header中需要显式的设置content-type为application/x-www-form-urlencoded,这样对于服务器来说这就是一个表单提交数据的请求。

后端controller:

javascript 复制代码
 @PostMapping("/login")
    public Map<String,String> login(String username, String password){
        log.info("username--->{}",username);
        log.info("password--->{}",password);
        Map<String,String> resp =   new HashMap<>();
        resp.put("message","wrong name or password");
        resp.put("token",null);
        if("abc".equals(username) && "123456".equals(password)){
            String token = UUID.randomUUID().toString();
            stringRedisTemplate.opsForValue().set("token",token,3600, TimeUnit.SECONDS);
            resp.put("message","success");
            resp.put("token",token);
            return resp;
        }
        return resp;
    }

如果是表单提交的数据,那么handler接收的方式不用添加任何额外的注解,利用名称对应,类型正确的方式就可以接收表单数据了。

相关推荐
野生技术架构师5 分钟前
SpringBoot+Elasticsearch实现高效全文搜索
spring boot·elasticsearch·jenkins
Angletank40 分钟前
SpringBoot中ORM组件通过JAP组件的使用
spring boot·后端·orm·jpa
白宇横流学长44 分钟前
基于SpringBoot实现的零食销售商城设计与实现【源码+文档】
java·spring boot·后端
老华带你飞1 小时前
个人网盘管理|基于springboot + vue个人网盘管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
九转苍翎1 小时前
Java外功核心(7)——深入源码,拆解Spring Bean作用域、生命周期与自动装配
spring boot
派大鑫wink10 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
xUxIAOrUIII10 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home10 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
JIngJaneIL11 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
全靠bug跑12 小时前
Spring Cloud OpenFeign 实战三部曲:快速集成 · 连接池优化 · 客户端抽取
java·spring boot·openfeign