SpringBoot Rest接口调用遇301跳转及curl错误求助
问题排查与解决
我帮你梳理下两个核心问题,一个是curl命令的格式错误,另一个是Spring接口参数绑定的问题,这两个共同导致了你看到的异常:
1. curl命令格式错误(直接触发报错的原因)
你的curl命令里,-d后的JSON数据既没有用引号整体包裹,还使用了中文引号(比如”Pere”里的引号是中文格式),这会让shell错误地把JSON拆分成多个独立参数,进而触发Port number ended with 'R'这类解析错误,甚至因为@符号的特殊含义,导致意外的301跳转指向gmail地址。
修正后的curl命令:
curl -X PUT \ -H "Content-Type: application/json" \ -H "Authorization: Bearer eyJhbGciOiJIazUxMiJ9.eyJzdWIiOiJyaWNhcmQub2xsZUBnbWFpbC5jb20iLCJleHAiOjE1MjgxMTM3NTIsImlhdCI6MTUyNzUwODk1Mn0.QdxabtU1U87pYvyTstT1EG3E6uVpLo2mXCF0FF8iD6acKoAXKl_A0-eV_GrpOFg5FF1qR6B7llI5_USJL85YTQ" \ -d '{"id":1,"username":"pere.peris@gmail.com","email":"pere.peris@gmail.com","firstName":"Pere","lastName":"PERIS","country":"CAT","enabled":true}' \ "http://127.0.0.1:2233/elcor/api/users/1"
- 用单引号
'包裹整个JSON内容,避免shell解析里面的特殊字符(比如@、空格) - 把所有中文引号替换成标准英文双引号
"
2. Spring接口参数绑定问题
就算curl命令修正了,你的接口也无法正确接收JSON请求体——因为你没有给User user参数添加@RequestBody注解。Spring默认会把无注解的参数当成URL请求参数绑定,而不是从请求体的JSON中解析。
修正后的接口代码:
@PutMapping(path = "api/users/{id}", consumes = "application/json", produces = "application/json") public ResponseEntity<User> updateUser (HttpServletRequest request, @PathVariable long id, @RequestBody User user) { System.out.println(user); saveUser(user); return ResponseEntity.ok(user); }
- 添加
@RequestBody注解,告诉Spring从请求体的JSON中反序列化生成User对象 - 额外提醒:确认你的
User类有无参构造函数和完整的getter/setter方法,否则Jackson无法正常解析JSON
额外检查点
- 确认嵌入式Tomcat的运行端口确实是
2233,避免URL端口匹配错误 - 检查
saveUser(user)方法是否正确关联了路径变量id(比如确保是更新指定id的用户,而非新增)
内容的提问来源于stack exchange,提问作者en Peris
相关产品推荐
相关产品推荐

