有些事情我不太了解。
当我使用带有以下命令的带有JSON的新鲜原始ASP.NET应用程序使用curl时:
curl -X POST -H "Content-Type: application/json" -X POST -d '{"username":"abc","password":"abc"}' https://localhost:5001/api/values --insecure -v
我的响应失败(错误请求400),出现以下错误:
{"":["Unexpected character encountered while parsing value: {. Path '', line 1, position 1."]}
但是...如果我将json数据复制到文件中,并以此方式调用CURL命令:
curl -X POST -H "Content-Type: application/json" -X POST -d @user.json https://localhost:5001/api/values --insecure -v
它很好用。
====>为什么/如何死?
谢谢
答案 0 :(得分:1)
这一直在我身上发生,我总是忘记!
简单修复,curl的内联数据不会自动转义双引号,因此您要做的就是:
curl -X POST -H "Content-Type: application/json" -X POST -d "{\"username\":\"abc\",\"password\":\"abc\"}" https://localhost:5001/api/values --insecure -v
答案 1 :(得分:1)
长话短说,Windows的curl
版本与其他版本的行为不同。使用双引号或使用Windows子系统(适用于Linux)中的Linux curl
版本。
详细解释
如果不同的curl调用导致不同的响应,则很明显 curl 会执行不同的操作,而不是ASP.NET。使用Fiddler之类的调试代理会显示第一个调用发送了:
POST http://localhost:5001/api/values HTTP/1.1
Host: localhost:5001
User-Agent: curl/7.55.1
Accept: */*
Proxy-Connection: Keep-Alive
Content-Type: application/json
Content-Length: 29
'{username:abc,password:abc}'
用:代替单引号和双引号。
curl -H "Content-Type: application/json" -X POST -d "{'username':'abc','password':'abc'}" http://localhost:5001/api/values --insecure -v -x 127.0.0.1:8888
发送:
POST http://localhost:5001/api/values HTTP/1.1
Host: localhost:5001
User-Agent: curl/7.55.1
Accept: */*
Proxy-Connection: Keep-Alive
Content-Type: application/json
Content-Length: 35
{'username':'abc','password':'abc'}
用于Linux的Windows子系统
通过Windows Subsystem for Linux使用Linux二进制文件可以避免所有这些情况。那是一个完整的Linux用户空间环境。在这种情况下,两个请求都发送有效的JSON:
{"username":"abc","password":"abc"}
和
{'username':'abc','password':'abc'}