Строковый параметр 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