Строковый параметр FromBody указывает значение null
Это, вероятно, что-то очень простое, но мне трудно понять, где я ошибаюсь.
Я пытаюсь захватить строку из тела POST, но "jsonString" отображается только как null. Я также хочу избежать использования модели, но, возможно, это невозможно. Часть кода, с которой я сталкиваюсь с PostMan, - это фрагмент:
[Route("Edit/Test")]
[HttpPost]
public void Test(int id, [FromBody] string jsonString)
{
...
}
Возможно, это то, что я делаю неправильно с почтальоном, но я пытался использовать "= test" (как видно из других вопросов, заданных по этой теме) в разделе значений тела - x-www-form- urlencoded раздел с ключом как jsonString и ничего. Я также попытался использовать raw-text и raw-text/plain. Я получаю идентификатор, поэтому я знаю, что URL правильный. Любая помощь с этим была бы весьма признательна.
PostMan настроен следующим образом:
POST http://localhost:8000/Edit/Test?id=111
key = id value = 111
Body - x-www-form-urlencoded
key = jsonString value = "=test"
Ответы
Ответ 1
Объявив параметр jsonString с помощью [FromBody]
, вы указываете, что ASP.NET Core использует входной форматтер для привязки предоставленного JSON (или XML) к модели. Поэтому ваш тест должен работать, если вы предоставите простой класс модели
public class MyModel
{
public string Key {get; set;}
}
[Route("Edit/Test")]
[HttpPost]
public void Test(int id, [FromBody] MyModel model)
{
... model.Key....
}
и отправленный JSON, например
{
key: "value"
}
Конечно, вы можете пропустить привязку модели и получить предоставленные данные напрямую, обратившись к HttpContext.Request
в контроллере. Свойство HttpContext.Request.Body
предоставляет вам поток контента или вы можете получить доступ к данным формы через HttpContext.Request.Forms
.
Я лично предпочитаю привязку модели из-за безопасности типа.
Ответ 2
Ссылка Связывание параметров в веб-интерфейсе ASP.NET
Использование [FromBody]
Чтобы заставить Web API читать простой тип из тела запроса, добавьте [FromBody] для параметра:
[Route("Edit/Test")]
[HttpPost]
public IHttpActionResult Test(int id, [FromBody] string jsonString) { ... }
В этом примере веб-API будет использовать форматтер медиа-типа для чтения значение jsonString из тела запроса. Вот пример клиента запрос.
POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1
User-Agent: Fiddler
Host: localhost:8000
Content-Type: application/json
Content-Length: 6
"test"
Когда параметр имеет [FromBody], Web API использует заголовок Content-Type для выбора форматирования. В этом примере тип содержимого "application/json", а тело запроса - это строка JSON с сыром (не JSON).
В приведенном выше примере модель не нужна, если данные предоставлены в правильном формате в теле.
Для URL-кода запрос будет выглядеть так:
POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1
User-Agent: Fiddler
Host: localhost:8000
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
=test
Ответ 3
При использовании атрибута [FromBody] отправляемая строка не должна быть строкой, а скорее строкой JSON, так как она включает в себя кавычки:
"test"
На основе https://weblog.west-wind.com/posts/2017/Sep/14/Accepting-Raw-Request-Body-Content-in-ASPNET-Core-API-Controllers
Аналогичное значение строки ответа равно Пустом при использовании FromBody в asp.net web api
Ответ 4
Вы на правильном пути.
В вашем наборе заголовков
Content-Type: application/x-www-form-urlencoded
Тело запроса POST должно быть =test
и больше ничего. Для неизвестных/переменных строк вы должны кодировать URL таким образом, чтобы вы случайно не выходили с входным символом.
См. также строка POST для приложения ASP.NET Web Api - возвращает значение null
Ответ 5
В моем случае я забыл использовать JSON.stringify(bodyStuff).
Ответ 6
Я знаю, что этот ответ добрый, и есть очень хорошие ответы, которые уже решают проблему.
Чтобы развернуть проблему, я хотел бы упомянуть еще одну вещь, которая сбила меня с ума в течение последних 4 или 5 часов.
ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ важно, чтобы ваши свойства в вашем классе модели включили атрибут set.
Это НЕ будет работать (параметр все еще null):
/* Action code */
[HttpPost]
public Weird NOURLAuthenticate([FromBody] Weird form) {
return form;
}
/* Model class code */
public class Weird {
public string UserId {get;}
public string UserPwd {get;}
}
Это будет работать:
/* Action code */
[HttpPost]
public Weird NOURLAuthenticate([FromBody] Weird form) {
return form;
}
/* Model class code */
public class Weird {
public string UserId {get; set;}
public string UserPwd {get; set;}
}
Ответ 7
Наконец-то все заработало после 1 часа борьбы.
Это устранит проблему с нулем, а также получит значение JSON key1 значение1 в общем виде (без привязки модели).
Для нового примера приложения WebApi 2:
Postman (looks exactly, like below):
POST http://localhost:61402/api/values [Send]
Body
(*) raw JSON (application/json) v
"{ \"key1\": \"value1\" }"
Порт 61402 или указанные выше значения url/api/могут отличаться.
ValuesController.cs
using Newtonsoft.Json;
// ..
// POST api/values
[HttpPost]
public object Post([FromBody]string jsonString)
{
// add reference to Newtonsoft.Json
// using Newtonsoft.Json;
// jsonString to myJsonObj
var myJsonObj = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonString);
// value1 is myJsonObj[key1]
var valueOfkey1 = myJsonObj["key1"];
return myJsonObj;
}
Пока все хорошо, не уверен, требуется ли привязка модели к классу, если у меня есть подключи, или, может быть, будет работать DeserializeObject для подключа.
Ответ 8
После долгого кошмара возиться с Google и пробовать неправильный код в переполнении стека, я обнаружил, что изменение (строковая модель [FromBody]) на (объектная модель [FromBody]) творит чудеса, пожалуйста, не использую .NET 4.0 да да, я знаю это старый, но...
Ответ 9
Отправьте строку с необработанным JSON и не забывайте двойные кавычки!
![enter image description here]()