Параметр строки 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"
аналогичный ответ строковое значение пусто при использовании FromBody в asp.net Web api
вы на правильном пути.
ваш заголовок
Content-Type: application/x-www-form-urlencoded
тело запроса POST должно быть =test
и больше ничего. Для неизвестных / переменных строк вы должны URL-адрес кодировать значение, чтобы вы случайно не убежали с входным символом.
см. также после строку в веб-приложении ASP.NET в API - возвращает null
Я знаю, что этот ответ довольно старая и есть некоторые очень хорошие ответы, которые уже решит проблему.
чтобы расширить проблему, я хотел бы упомянуть еще одну вещь, которая сводила меня с ума в течение последних 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-ключе будет работать.