Параметр строки FromBody дает null

это, вероятно, что-то очень основное, но у меня возникли проблемы с выяснением, где я ошибаюсь.

Я пытаюсь захватить строку из тела сообщения, но "jsonString" отображается только как null. Я также хочу избежать использования модели, но, возможно, это невозможно. Кусок кода, который я поражаю почтальоном, - это кусок:

[Route("Edit/Test")]
[HttpPost]
public void Test(int id, [FromBody] string jsonString)
{
    ...
}

может быть, это то, что я делаю неправильно с почтальоном, но я пытался использовать "=test " (как видно из других вопросы, заданные по этой теме) В разделе значения раздела body-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"

7 ответов


объявив параметр jsonString с [FromBody] вы говорите ASP.NET ядро для использования входного форматирования для привязки предоставленного 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 в контроллере. The HttpContext.Request.Body свойство дает вам поток контента или вы можете получить доступ к форме данные через HttpContext.Request.Forms.

Я лично предпочитаю привязку модели из-за безопасности типа.


ссылка привязка параметров в ASP.NET Web API

Использование [FromBody]

чтобы заставить Web API читать простой тип из тела запроса, добавьте [FromBody] параметр:

[Route("Edit/Test")]
[HttpPost]
public IHttpActionResult Test(int id, [FromBody] string jsonString) { ... }

В этом примере Web 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

при наличии атрибута [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


вы на правильном пути.

ваш заголовок

Content-Type: application/x-www-form-urlencoded

тело запроса POST должно быть =test и больше ничего. Для неизвестных / переменных строк вы должны URL-адрес кодировать значение, чтобы вы случайно не убежали с входным символом.


см. также после строку в веб-приложении ASP.NET в API - возвращает null


в моем случае я забыла формат JSON.преобразовать в строки(bodyStuff).


Я знаю, что этот ответ довольно старая и есть некоторые очень хорошие ответы, которые уже решит проблему.

чтобы расширить проблему, я хотел бы упомянуть еще одну вещь, которая сводила меня с ума в течение последних 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;}
}

наконец - то он заработал после 1 часа борьбы.

это удалит нулевую проблему, также получает JSON key1'S стоимостью value1 в общем виде (без привязки модели), .

для нового примера приложения WebApi 2:

почтальон (выглядит точно, как показано ниже):

POST    http://localhost:61402/api/values   [Send]

              Body
                   (*) raw             JSON (application/json) v

"{  \"key1\": \"value1\" }"

порт 61402 или URL-адресом / api / values выше, может быть по-другому для вас.

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;
}

пока все хорошо, не уверен, требуется ли привязка модели к классу, если у меня есть sub-ключи, или, может быть, DeserializeObject на sub-ключе будет работать.