我向REST API发出POST请求以上传文件。在邮递员一切正常。我添加了从服务器获取的基本授权和自定义CSRF(XSRF)令牌。
我想使用cURL做同样的事情。我从Postman复制了代码,但似乎没有用。 我认为错误与CSRF有关,因为如果我关闭服务器上的CSRF并在没有CSRF令牌的情况下进行相同的cURL调用,一切正常。
现在更多细节: 这就是Postman给出的cURL命令:
curl -X POST -H "XSRF: 79f51981-8e85-4e26-be1b-bf63aed92a42" -H "Authorization: Basic bbhjbjb=" -H "Cache-Control: no-cache" -H "Postman-Token: 76a7a43b-f407-15a2-aaff-5242b44d0f47" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "package=@C:\Downloads\hello-world.zip" "http://host:port/api/import"
这就是我得到的回复--verbose
- 不支持名称查找超时
- 尝试:: 1 ...
- 连接到localhost(:: 1)端口7777(#0)
- POST / api / import HTTP / 1.1
- 主持人:localhost:7777
- User-Agent:curl / 7.47.1
- 接受: /
- XSRF:79f51981-8e85-4e26-be1b-bf63aed92a42
- 授权:基本bbhjbjb =
- 缓存控制:无缓存
- Postman-Token:76a7a43b-f407-15a2-aaff-5242b44d0f47
- 内容长度:31281
- 期待:100-continue
- 内容类型:multipart / form-data;边界= ---- WebKitFormBoundary7MA4YWxkTrZu0gW; 边界= ------------------------ 742d3475ac5f6aba
- <找到HTTP / 1.1 302
- < Set-Cookie:JSESSIONID = 1qfjmbntrthxll; Path = / api<到期日:1970年1月1日星期四00:00:00 GMT
- < Set-Cookie:XSRF = b29bd143-cc80-49ad-b495-711125678o; Path = /; Expires = Thu,15-Dec-2016 10:28:46 GMT
- < XSRF:b29bd143-cc80-49ad-b495-711125678o<位置:
- http://localhost:7777/api/login/error.jsp?errorMessage=Access拒绝
- <内容长度:0
- <服务器:Jetty(9.2.17.v20160517)
- 发送结束前的HTTP错误,停止发送
- 关闭连接0
我可能遗漏了一些非常明显的东西,但还不知道还有什么。 看起来我被重定向到登录页面,没有正确认证,但不知道为什么(我在cURL中发送XSRF)。我也尝试在cURL中添加sessionid - 也没有用。
任何有关搜索地点的想法和方向都将非常受欢迎!!!
答案 0 :(得分:1)
答案 1 :(得分:0)
目前还不清楚您的服务器端代码是如何实现的。这里可以看到一个明显的区别是请求标头User-Agent: curl/7.47.1
中的UserAgent字符串。您可以尝试在卷曲请求中添加-A "Mozilla/5.0"
。
关于上述关于XSRF一次性令牌的评论;您的服务器正在返回Set-Cookie
标头作为响应。邮递员可能会将其用作第二次请求的cookie,这就是为什么它一遍又一遍地为它工作的原因。您可以尝试在卷曲结束时添加-H "Cookie: XSRF=b29bd143-cc80-49ad-b495-711125678o"
,看看是否有任何区别。
这些都是疯狂的猜测。最好在服务器端添加一些可以打印请求标头的代码。然后提出两个请求,一个来自卷曲,另一个来自邮递员。之后检查请求标头之间的差异。那会给你一些线索。
答案 2 :(得分:0)
最后,事实证明会话ID是必需的(在cURL中添加JSESSIONID解决了该问题)。
答案 3 :(得分:-1)
如果没有关于服务器端代码的更多信息,我也不确定。如果您是从cURL而不是Postman拨打电话,您真的需要Postman-Token标头吗?也许如果你删除-H" Postman-Token:76a7a43b-f407-15a2-aaff-5242b44d0f47"来自代码。
curl -X POST -H "XSRF: 79f51981-8e85-4e26-be1b-bf63aed92a42" -H "Authorization: Basic bbhjbjb=" -H "Cache-Control: no-cache" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "package=@C:\Downloads\hello-world.zip" "http://host:port/api/import"