惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
有赞技术团队
有赞技术团队
博客园_首页
IT之家
IT之家
爱范儿
爱范儿
量子位
小众软件
小众软件
Jina AI
Jina AI
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
The Cloudflare Blog
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
雷峰网
雷峰网
V
Visual Studio Blog
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
Last Week in AI
Last Week in AI
S
SegmentFault 最新的问题

博客园 - jiduoduo

Content-Type 是 HTTP 请求 / 响应头中核心的字段 mvn clean install -U Maven 不建议 利用 systemPath 引用本地文件jar ollama本地大模型的安装与使用 字符串 md5在线生成的小工具 如何使用剪映加入字幕 Navicat Premium Lite 17 免费的工具 nginx配置支持websocket协议wss nginx配制微信公众号业务域名,重启服务等,都不行 windows 新建bat来显示ip,并且不关闭 类型“any”的参数不能赋给类型“never”的参数。 mac code google chrome cpu占用大 风扇就开始转 springboot连接sqlserver2008r2 驱动版本问题。 vue3项目打包的时候报错'openBlock' is not exported by node_modules/... mac 截屏到指定的目录 vue3 优化ai生成的手写签名 系统里的查询奇慢无比,但是sqlserver中只要6s,在软件中要40几秒。 c++结构体、共用体(联合体) 无法打开“fsevents.node”,因为无法验证开发者。
POST 方法是否能提交 @RequestParam的使用
jiduoduo · 2026-02-19 · via 博客园 - jiduoduo

POST 方法能提交 @RequestParam 类型的参数,以及在 Vue3 中如何实现这种前端请求,核心是搞懂 POST + @RequestParam 的适配方式和前端具体代码写法。

二、核心结论

POST 方法完全可以提交 @RequestParam 参数

@RequestParam 本质是接收「URL 查询参数」或「表单键值对参数」,和请求方法(GET/POST)无关 —— 只要前端按对应格式传参,POST 方法一样能被 @RequestParam 解析。

三、Vue3 实现 POST + @RequestParam 的两种方式

方式 1:表单格式(推荐,适配 application/x-www-form-urlencoded

这是最标准的方式,对应服务端 @RequestParam 接收,也是你之前登录接口的适配方式。

前端 Vue3 代码(axios 示例)
<template>
  <div>
    <input v-model="username" placeholder="用户名" />
    <input v-model="password" type="password" placeholder="密码" />
    <button @click="login">登录</button>
  </div>
</template>

<script setup>
import axios from 'axios';
import { ref } from 'vue';

// 定义参数
const username = ref('');
const password = ref('');

// 登录请求(POST + 表单格式参数)
const login = async () => {
  try {
    // 1. 构造表单参数(键值对)
    const params = new URLSearchParams();
    params.append('username', username.value);
    params.append('password', password.value);

    // 2. 发送POST请求
    const res = await axios.post(
      '/login', // 请求地址
      params,   // 请求体(表单格式)
      {
        // 关键:设置Content-Type为表单格式
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      }
    );
    console.log('登录成功', res.data);
  } catch (err) {
    console.error('登录失败', err);
  }
};
</script>
简化写法(用 qs 库,更便捷)

如果参数多,可借助 qs 库(需先安装:npm install qs):

import qs from 'qs';

// 替换上述 params 部分
const data = {
  username: username.value,
  password: password.value
};
// qs.stringify 会把对象转成 "username=admin&password=123456" 格式
const res = await axios.post('/login', qs.stringify(data), {
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
});

方式 2:查询参数(URL 拼接,GET/POST 通用)

@RequestParam 也能接收 URL 后的查询参数,POST 方法同样支持这种方式(但不推荐传密码等敏感信息)。

前端 Vue3 代码
const login = async () => {
  try {
    const res = await axios.post(
      '/login', // 请求地址
      {}, // POST请求体为空
      {
        // 参数拼在URL后(?username=xxx&password=xxx)
        params: {
          username: username.value,
          password: password.value
        }
      }
    );
    console.log('登录成功', res.data);
  } catch (err) {
    console.error('登录失败', err);
  }
};

四、服务端对应代码(无需修改,保持原 @RequestParam 即可)

@PostMapping("/login")
public Result<String> login(
        @RequestParam String username,
        @RequestParam String password) {
    // 业务逻辑...
    return Result.success("登录成功", token);
}

五、关键区别与注意事项

方式Content-Type参数位置适用场景
方式 1(表单) application/x-www-form-urlencoded 请求体 普通业务参数(推荐,支持敏感信息)
方式 2(查询参数) 无(默认) URL 后缀 非敏感、简单参数(不推荐传密码)

避坑点:

  1. 前端用方式 1 时,必须设置 Content-Type: application/x-www-form-urlencoded,否则服务端无法解析;
  2. 不要把 JSON 对象直接传给 POST 请求体(比如 axios.post('/login', {username, password}))—— 此时 Content-Type 是 application/json,服务端 @RequestParam 会解析失败;
  3. 敏感参数(如密码)优先用方式 1(请求体),避免拼在 URL 中(URL 会被日志记录,不安全)。

总结

  1. POST 方法完全支持提交 @RequestParam 参数,核心是前端传参格式匹配;
  2. Vue3 中推荐用「URLSearchParams/qs 库 + application/x-www-form-urlencoded」的方式,参数放在请求体;
  3. 服务端无需修改 @RequestParam 代码,保持原有写法即可;
  4. 敏感参数避免拼在 URL 中,优先用表单格式传请求体。