针对ASP.NET使用CURL和json

时间:2019-02-08 14:14:49

标签: asp.net json curl

有些事情我不太了解。

当我使用带有以下命令的带有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

它很好用。

====>为什么/如何死?

谢谢

2 个答案:

答案 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'}