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 小时前
小九源码-springboot004-springboot智能阅读推荐系统
java·spring boot·后端
xiaotianyuanma7 小时前
【计算机毕业设计】基于Spring Boot的体育馆预约系统的设计与实现
java·spring boot·课程设计
2601_963870218 小时前
【计算机毕业设计】基于Spring Boot的非遗文创产品交易平台的设计与实现
java·spring boot·后端
andongni2039 小时前
后端参数校验
spring boot·后端·mybatis
2601_9638702211 小时前
【计算机毕业设计】基于Spring Boot的考研信息交流平台的设计与实现
java·spring boot·后端
大模型丫丫12 小时前
Spring Boot 入门指南:从零开始构建你的第一个应用
java·spring boot·后端
gis开发之家12 小时前
日志怎么打才专业?Spring Boot 4 日志体系与 Logback 配置(生产级实战)
java·spring boot·后端·logback
2601_963870181 天前
【计算机毕业设计】基于Spring Boot的宠物领养救助平台的设计与实现
spring boot·课程设计·宠物
凤山老林1 天前
高保真集成测试:Spring Boot 结合 Testcontainers 的工程落地
spring boot·后端·集成测试
RuoyiOffice1 天前
SpringBoot3+Vue3 接口访问日志实战:@ApiAccessLog 慢接口、参数脱敏与 OperateLog 如何分工
spring boot·vue3·traceid·spring boot 3·访问日志·apiaccesslog·操作日志