it-swarm.com.ru

Строковый параметр FromBody дает ноль

Вероятно, это что-то очень простое, но мне трудно понять, где я иду не так. 

Я пытаюсь получить строку из тела сообщения POST, но «jsonString» показывает только как ноль. Я также хочу избежать использования модели, но, возможно, это невозможно. Кусок кода, который я использую в 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"
21
Robert Prine

Объявляя параметр 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.

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

32
Ralf Bönning

Ссылка Привязка параметров в 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], веб-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
32
Nkosi

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

 

11
Michael Freidgeim

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

На вашем заголовке установлен

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

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


См. Также POST строка для приложения ASP.NET Web Api - возвращает ноль

5
Igor

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

Чтобы расширить тему, я хотел бы упомянуть еще одну вещь, которая сводила меня с ума в течение последних 4 или 5 часов.


Это ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ важно, чтобы в свойствах вашего класса модели был включен атрибут set .


Это НЕ БУДЕТ работать (параметр по-прежнему нулевой):

/* 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;}
}
2
Some random IT boy

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

1
Eugene

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

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

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

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

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 для подключа.

0
Manohar Reddy Poreddy