c# - fromuri - web api frombody parameters
El parámetro de cadena FromBody está dando nulo (8)
Esto es probablemente algo muy básico, pero estoy teniendo problemas para averiguar dónde me estoy equivocando.
Estoy tratando de agarrar una cadena del cuerpo de una POST, pero "jsonString" solo se muestra como nulo. También quiero evitar usar un modelo, pero tal vez esto no sea posible. El fragmento de código que estoy usando con PostMan es este fragmento:
[Route("Edit/Test")]
[HttpPost]
public void Test(int id, [FromBody] string jsonString)
{
...
}
Tal vez es algo que estoy haciendo incorrectamente con el cartero, pero he estado tratando de usar "= test" (como se ve en otras preguntas sobre este tema) en la sección de valores del cuerpo - x-www-form-urlencoded section con la clave como jsonString y nada. También he intentado usar raw - text y raw - text / plain. Obtengo la identificación, así que sé que la url es correcta. Cualquier ayuda con esto sería muy apreciada.
PostMan está configurado de esta manera actualmente:
POST http://localhost:8000/Edit/Test?id=111
key = id value = 111
Body - x-www-form-urlencoded
key = jsonString value = "=test"
Al declarar el parámetro jsonString con
[FromBody]
le dice a ASP.NET Core que use el formateador de entrada para vincular el JSON (o XML) proporcionado a un modelo.
Por lo tanto, su prueba debería funcionar si proporciona una clase de modelo simple
public class MyModel
{
public string Key {get; set;}
}
[Route("Edit/Test")]
[HttpPost]
public void Test(int id, [FromBody] MyModel model)
{
... model.Key....
}
y un JSON enviado como
{
key: "value"
}
Por supuesto, puede omitir el enlace del modelo y recuperar los datos proporcionados directamente accediendo a
HttpContext.Request
en el controlador.
La propiedad
HttpContext.Request.Body
le proporciona la secuencia de contenido o puede acceder a los datos del formulario a través de
HttpContext.Request.Forms
.
Personalmente prefiero el modelo de encuadernación debido al tipo de seguridad.
Al tener el atributo [FromBody], la cadena enviada no debe ser una cadena sin formato, sino una cadena JSON, ya que incluye las comillas de ajuste:
"test"
El valor de cadena de respuesta similar está vacío cuando se usa FromBody en asp.net web api
Después de una larga pesadilla de jugar con Google y probar el código incorrecto en descubrí que cambiar (modelo de cadena [FromBody]) a (modelo de objeto [FromBody]) hace maravillas, por favor, no estoy usando .NET 4.0 sí, sí, lo sé s viejo pero ...
En mi caso, olvidé usar JSON.stringify (bodyStuff).
Estás en el camino correcto.
En su conjunto de encabezado
Content-Type: application/x-www-form-urlencoded
El cuerpo de la solicitud POST debe ser
=test
y nada más.
Para cadenas desconocidas / variables, debe codificar con URL el valor para que así no se escape accidentalmente con un carácter de entrada.
Consulte también POST cadena a la aplicación ASP.NET Web Api - devuelve nulo
Finalmente lo hice funcionar después de 1 hora de lucha.
Esto eliminará el problema nulo, también obtiene el valor de la clave JSON1 de valor1 , de forma genérica (sin enlace de modelo),.
Para un nuevo ejemplo de aplicación WebApi 2:
Cartero (se ve exactamente igual que a continuación):
POST http://localhost:61402/api/values [Send]
Body
(*) raw JSON (application/json) v
"{ /"key1/": /"value1/" }"
El puerto 61402 o url / api / valores anteriores, puede ser diferente para usted.
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;
}
Todo bien por ahora, no estoy seguro de si se requiere el enlace del modelo a una clase si tengo claves secundarias, o, puede ser DeserializeObject en la clave secundaria funcionará.
Referencia del enlace de parámetros en la API web ASP.NET
Usando [FromBody]
Para obligar a la API web a leer un tipo simple del cuerpo de la solicitud, agregue el atributo [FromBody] al parámetro:
[Route("Edit/Test")] [HttpPost] public IHttpActionResult Test(int id, [FromBody] string jsonString) { ... }
En este ejemplo, la API web utilizará un formateador de tipo multimedia para leer el valor de jsonString del cuerpo de la solicitud. Aquí hay un ejemplo de solicitud del cliente.
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"
Cuando un parámetro tiene [FromBody], la API web usa el encabezado Content-Type para seleccionar un formateador. En este ejemplo, el tipo de contenido es "application / json" y el cuerpo de la solicitud es una cadena JSON sin formato (no un objeto JSON).
En el ejemplo anterior, no se necesita ningún modelo si los datos se proporcionan en el formato correcto en el cuerpo.
Para una URL codificada, una solicitud se vería así
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
Sé que esta respuesta es un poco vieja y hay algunas respuestas muy buenas que ya resuelven el problema.
Para ampliar el problema, me gustaría mencionar una cosa más que me ha vuelto loco durante las últimas 4 o 5 horas.
Es MUY MUY MUY importante que sus propiedades en su clase de modelo tengan habilitado el atributo set .
Esto
NO
funcionará (el parámetro sigue siendo nulo):
/* 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;}
}
Esto funcionará:
/* 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;}
}