对ASP.NET使用带json的CURL

对ASP.NET使用带json的CURL,asp.net,json,curl,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 encou

有件事我不太明白

当我使用以下命令对新创建的带有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
它很好用

=>为什么/怎么回事


谢谢

这种事一直发生在我身上,我总是忘记

简单的修复方法是,curl的内联数据不会自动转义双引号,因此您所要做的就是:

curl -X POST -H "Content-Type: application/json" -X POST -d "{\"username\":\"abc\",\"password\":\"abc\"}" https://localhost:5001/api/values --insecure -v

这种事一直发生在我身上,我总是忘记

简单的修复方法是,curl的内联数据不会自动转义双引号,因此您所要做的就是:

curl -X POST -H "Content-Type: application/json" -X POST -d "{\"username\":\"abc\",\"password\":\"abc\"}" https://localhost:5001/api/values --insecure -v

长话短说,Windows的
curl
版本的行为与其他版本不同。使用双引号或使用Windows Subsystem for 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子系统中使用

所有这些都可以通过使用Linux二进制文件来避免。这是一个完整的Linux用户空间环境。在这种情况下,两个请求都发送有效的JSON:

{"username":"abc","password":"abc"}


长话短说,Windows的
curl
版本的行为与其他版本不同。使用双引号或使用Windows Subsystem for 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子系统中使用

所有这些都可以通过使用Linux二进制文件来避免。这是一个完整的Linux用户空间环境。在这种情况下,两个请求都发送有效的JSON:

{"username":"abc","password":"abc"}


你送了什么?你真的不知道。显然,curl在这两种情况下做了一些不同的事情。使用调试代理(如Fiddler)查看真正发送到服务的内容。您发送了什么?你真的不知道。显然,curl在这两种情况下做了一些不同的事情。使用像Fiddler这样的调试代理来查看真正发送到服务的内容。我仍然会收到相同的错误:(,但是如果我用双引号将所有内容都括起来,它会起作用:curl-X POST-H“Content-Type:application/json”-X POST--data“{”用户名“:”abc“,”密码“:”abc“}”——不安全-v@MichaelManuelVandycke检查更新。如果您使用WSL和Linux版本的
curl
,您可以避免这种情况。我在Ubuntu上试用过,Windows应用商店中也有其他发行版,例如SUSE、Kali、DebianI使用WSL,如果我这样做curl:curl-X POST-H“Content Type:application/json”-X POST--data{“username”:“abc”,“password”:“abc”}--unsecure-v,我得到{”“:[“解析值时遇到意外字符:u.Path“”,第1行,位置1.]}。但是它与以下内容一起工作:curl-X POST-H“Content Type:application/json”-X POST--data“{”username:“abc”,“password”:“abc”}”-vI仍然得到相同的错误:(,但如果我用双引号将所有内容都括起来,它就可以工作:curl-X POST-H“Content-Type:application/json”-X POST-data“{”username:“abc”,“password:“abc”}”——不安全-v@MichaelManuelVandycke检查更新。如果您使用WSL和Linux版本的
curl
,您可以避免这种情况。我在Ubuntu上试用过,Windows应用商店中也有其他发行版,例如SUSE、Kali、DebianI使用WSL,如果我这样做curl:curl-X POST-H“Content Type:application/json”-X POST--data{“username”:“abc”,“password”:“abc”}--unsecure-v,我得到{”“:[“解析值时遇到意外字符:u.Path“”,第1行,位置1.]}。但是它与以下内容一起工作:curl-X POST-H“Content Type:application/json”-X POST--data“{”username:“abc”,“password”:“abc”}--unsecure-v