使用cURL发送带参数POST请求时Spring UUID转换报错排查
问题分析与解决
这个问题的根源在于你的cURL命令存在两个关键错误,导致Spring控制器接收到的user_id值变成了"new",无法转换为UUID:
1. 错误使用Shell命令替换$(...)
你用$(curl ...)包裹了整个cURL命令,这在Shell中是命令替换语法——它会先执行curl命令,然后把curl的输出结果当作一条新的Shell命令去执行。这完全不是发送POST请求的正确方式,不仅毫无必要,还可能干扰curl命令本身的参数解析,导致请求URL被错误处理。
2. URL未用引号包裹,特殊字符被Shell解析
你的URL中包含?这个特殊字符,在Shell中?是通配符(匹配单个字符)。如果当前目录下没有匹配new?格式的文件,Shell会保留?,但如果有匹配的文件,或者Shell的解析逻辑出现异常,就会导致URL的参数部分被错误截断或替换,最终传递给Spring的user_id参数值出现混乱。
正确的cURL命令写法
修改后的命令应该去掉命令替换,并用双引号包裹URL,避免特殊字符被Shell解析:
host="http://localhost:8080" curl -s -X POST -H "Content-Type: application/json" -d '{"name":"Test", "description":"Test"}' "$host/games/new?user_id=c13fb734-c72a-48a0-9fd7-5fbc79c6285a"
额外的控制器优化建议
虽然不是当前错误的原因,但你的控制器代码里有一个参数名不一致的问题:
- 控制器接收的请求参数是
user_id(下划线命名) - 转发时使用的参数名是
userId(驼峰命名)
建议保持两者一致,避免后续出现参数传递丢失的问题,比如把转发的URL改为:
String url = ROOT_URL + "/new?user_id=" + String.valueOf(userId);
内容的提问来源于stack exchange,提问作者Denis Steinman
相关产品推荐
相关产品推荐

