curl -L参数无法跟随POST请求重定向但Postman跳转正常的问题咨询
问题解答
1. 错误原因说明
该问题是curl显式指定请求方法后的默认行为导致的,和你的业务代码逻辑无关:
- 当你没有通过
--request(-X)参数显式指定请求方法时,curl遇到POST请求返回的302重定向,会自动将后续重定向请求的方法改为GET,符合通用HTTP规范,-L参数的跳转逻辑可以正常执行。 - 一旦你在命令中显式添加了
--request POST参数,curl会强制在所有重定向请求中沿用POST方法,不会做自动转换,因此重定向到仅支持GET方法的/WebServletApp/defaultEmployee路径时,服务端返回405状态码,提示POST方法不被支持。
2. Postman与curl行为差异原因
Postman的重定向跟随逻辑对齐普通浏览器的默认行为:POST请求触发302重定向时,会自动将后续跳转请求的方法修改为GET,不会保留原POST方法,因此可以正常获取到DefaultEmployeeServlet返回的结果。
修复方案
可任选以下一种方式调整curl命令即可解决问题:
方案1:移除显式指定的--request POST参数
由于你携带了--data-urlencode类型的请求参数,curl默认会以POST方法发起请求,无需额外指定,此时-L参数会正常触发POST转GET的重定向逻辑:
curl -iL '127.0.0.1:7001/WebServletApp/employee' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'firstName=Harshit' \ --data-urlencode 'lastName=Rajput' \ --data-urlencode 'emailId=harajput@gmail.com' \ --data-urlencode 'password=yolo!'
方案2:保留显式POST指定,添加跳转方法转换参数
如果必须显式指定请求方法,可以额外添加--post302参数,告知curl遇到302重定向时将POST请求转换为GET:
curl -iL --post302 --request POST '127.0.0.1:7001/WebServletApp/employee' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'firstName=Harshit' \ --data-urlencode 'lastName=Rajput' \ --data-urlencode 'emailId=harajput@gmail.com' \ --data-urlencode 'password=yolo!'
内容的提问来源于stack exchange,提问作者Harshit Rajput
相关产品推荐
相关产品推荐

