Код не читает JSON из запроса curl, но работает только с JSON
Привет,
Я написал API на c#, который обновляет таблицу SQL. API передает JSON в код. Если я запускаю API через Postman, код работает правильно и обновляет таблицу SQL, но если я запускаю команду CURL, я получаю сообщение об ошибке "ссылка на объект не установлена на экземпляр объекта".
Пытаясь понять, что происходит, я вижу, что значения в модели, по-видимому, не заполняются при запуске через CURL.
Это, вероятно, что-то простое, я был бы признателен, если бы кто-то мог указать мне правильное направление.
Что я уже пробовал:
Моя модель...
public class Balance { public string customer { get; set; } public string amount { get; set; } public string type { get; set; } } public class CreateUpdate : Balance { }
и раздел PUT API, который работает, если я бегу через Postman...
// PUT api/<controller>/5 public string Put([FromBody]CreateUpdate value) { _conPU = new SqlConnection(ConfigurationManager.ConnectionStrings["TestConnection"].ConnectionString); var query = "insert into L_UPD (ACUID, AMNT, DATE ,COMMENTS) " + "values (@ACUID, CASE WHEN @TYPE = 'debit' THEN @POINTS * -1 ELSE @POINTS END, getdate() , CASE WHEN @TYPE = 'debit' THEN 'REDEEM : ONLINE' ELSE 'EARN : ONLINE' END)"; SqlCommand insertcommand = new SqlCommand(query, _conPU); insertcommand.Parameters.AddWithValue("@ACUID", value.customer); insertcommand.Parameters.AddWithValue("@POINTS", value.amount); insertcommand.Parameters.AddWithValue("@TYPE", value.type); _conPU.Open(); int result = insertcommand.ExecuteNonQuery(); if (result > 0) { return "approved"; } else { return "update failed"; } }
Запрос curl-это
curl -X PUT -H "Content-Type: application/json" -d '{"customer":"435673","amount":5,"type":"debit"}' http://localhost:55634/api/balance
РЕДАКТИРОВАТЬ :
Через почтальона, если я попробую просто json, например
{"customer":"435673","amount":5,"type":"debit"}
код работает, но в postman, если я использую curl
curl -X PUT -H "Content-Type: application/json" -d '{"customer":"435673","amount":5,"type":"debit"}'http://localhost:55634/api/balance
это не работает.
F-ES Sitecore
Вы можете заставить postman сгенерировать команду curl для вас, нажав на ссылку "код" и выбрав cURL из опций. Это работает? Если это так, измените его, удалив вещи, которые не появляются в вашем, пока он не перестанет работать, и то, что вы удалили последним, вероятно, даст вам знать, в чем была проблема.
Bullgill Coder
Я сгенерировал команду curl и попробовал выполнить запрос выше в postman и получил ту же ошибку для обоих. Проблема в том, что мой код - при использовании curl, похоже, не передает JSON в модель.
F-ES Sitecore
Что - то, что нужно попробовать, - это использовать HttpRequestMessage вместо FromBody
https://stackoverflow.com/questions/39030314/webapi-frombody-always-null
посмотрите, если это, по крайней мере, видя ваш json как строку, если это так, вы можете просто десериализовать эту строку самостоятельно в свой класс CreateUpdate.
Bullgill Coder
Когда я перехожу на HttpRequestMessage (если я делаю это правильно) Значение (значение CreateUpdate) имеет значение null, когда я использовать команду curl, но опять же, когда я просто использовать JSON значение заполняется правильно.
Sandeep Mewara
http://localhost:55634/api/balance => является ли этот URL-адрес действительным? Спрашивая об этом, основываясь на порте.
Это доступно?
Кроме того, поверьте, что ваш запрос здесь больше о том, почему CURL не работает, а затем ошибка ссылки на объект. Вы знаете, почему у вас есть эта ошибка (так как ответ не находится в желаемом формате, и вы не обработали этот плохой ответ)
Richard Deeming
Если вы используете curl на Windows, есть предложение в этот поток переполнения стека[^] что размещение одинарных кавычек вокруг JSON не работает.