Использование CURL с JSON против ASP.NET - PullRequest
0 голосов
/ 08 февраля 2019

есть кое-что, что я не могу хорошо понять.

Когда я использую curl для свеже-сырого приложения ASP.NET с JSON, используя эту команду:

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 голосов
/ 08 февраля 2019

Короче говоря, версия curl для Windows не ведет себя так же, как другие.Либо используйте двойные кавычки, либо используйте версию Linux curl из подсистемы Windows для Linux.

Длинное объяснение

Если разные вызовы 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'}

Usin Windows Subsystem для Linux

Всего этого можно избежать, используя двоичные файлы Linux через Windows Subsystem для Linux .Это полная среда пространства пользователя Linux.В этом случае оба запроса отправляют действительный JSON:

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

и

{'username':'abc','password':'abc'}
0 голосов
/ 08 февраля 2019

это случается со мной все время, и я всегда забываю!

Простое исправление: встроенные данные для curl автоматически не экранируют двойные кавычки, поэтому все, что вам нужно сделать, это:

curl -X POST -H "Content-Type: application/json" -X POST -d "{\"username\":\"abc\",\"password\":\"abc\"}" https://localhost:5001/api/values --insecure -v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...