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接收的方式不用添加任何额外的注解,利用名称对应,类型正确的方式就可以接收表单数据了。

相关推荐
敖正炀1 小时前
WebFlux 深度:Reactor 线程模型、背压与错误处理
spring boot
BING_Algorithm1 小时前
一文搞定 AOP 所有核心知识点
spring boot·后端·spring
勿忘初心12212 小时前
【Java实战】SpringBoot 集成 freemarker 导出 Word 模板
java·spring boot·freemarker·模板引擎·word导出·后端实战
绿草在线2 小时前
SpringBoot项目实战:从零搭建高效开发环境
java·spring boot·后端
空中海3 小时前
Spring Boot Kafka 项目 Demo:订单事件系统 专家知识、源码阅读路线与面试题
spring boot·kafka·linq
默 语1 天前
基于 Spring Boot 3 + LangChain4j 快速构建企业级 AI 应用实战
人工智能·spring boot·后端
薪火铺子1 天前
SpringBoot WebServer启动与监听器原理深度解析
spring boot·后端·tomcat
KmSH8umpK1 天前
SpringBoot 分布式锁实战:从单机锁到Redis分布式锁全覆盖,解决超卖、重复下单、幂等并发问题
spring boot·redis·分布式
jay神1 天前
基于团队模式的C程序设计课程辅助教学管理系统
java·spring boot·vue·web开发·管理系统
长河1 天前
基于 Jib 实现无 Dockerfile 的 Spring Boot 应用容器化
java·spring boot·后端