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

相关推荐
来自星星的坤41 分钟前
Spring Boot 邮件发送配置遇到的坑:解决 JavaMailSenderImpl 未找到的错误
java·开发语言·spring boot·后端·spring
梦想实现家_Z1 小时前
Spring Boot整合DeepSeek+MCP实践详解
spring boot·deepseek·mcp
缘友一世2 小时前
解决Spring Boot上传默认限制文件大小和完善超限异常(若依框架)
java·spring boot·后端
小杨4042 小时前
springboot框架项目实践应用十七(springcloud整合nacos)
spring boot·后端·spring cloud
亭台烟雨中2 小时前
【Springboot后端之间使用websocket长连接通信】
spring boot·后端·websocket
Foyo Designer6 小时前
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 的未来:从微服务到云原生的演进
java·spring boot·redis·spring·微服务·云原生·restful
Yharim7 小时前
Spring框架 - SpringBoot
spring boot·面试
幽络源小助理7 小时前
SpringBoot学生成绩管理系统设计与实现
java·spring boot·后端
追光的独行者8 小时前
Springboot框架—单元测试操作
java·spring boot·单元测试
spe14378 小时前
【学习自用】配置文件中的配置项
java·spring boot·学习·mybatis