Estoy buscando la forma correcta de devolver JSON con un código de estado HTTP en mi controlador de API web .NET Core. Solía usarlo así:
public IHttpActionResult GetResourceData()
{
return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}
Esto fue en una aplicación MVC 4.6 pero ahora con .NET Core que no parecen tener este IHttpActionResult
tengo ActionResult
y el uso de la siguiente manera:
public ActionResult IsAuthenticated()
{
return Ok(Json("123"));
}
Pero la respuesta del servidor es extraña, como en la imagen a continuación:
Solo quiero que el controlador de API web devuelva JSON con un código de estado HTTP como lo hice en Web API 2.
c#
json
asp.net-core
asp.net-core-webapi
Rossco
fuente
fuente
CreatedAtRoute
el método etcRespuestas:
La versión más básica que responde con un
JsonResult
es:Sin embargo, esto no ayudará con su problema porque no puede manejar explícitamente su propio código de respuesta.
por ejemplo:
Tenga en cuenta que ambos ejemplos anteriores provienen de una excelente guía disponible de la documentación de Microsoft: Formateo de datos de respuesta
Cosas extra
El problema que encuentro con bastante frecuencia es que quería un control más granular sobre mi WebAPI en lugar de simplemente ir con la configuración predeterminada de la plantilla "Nuevo proyecto" en VS.
Asegurémonos de tener algunos de los conceptos básicos ...
Paso 1: configura tu servicio
Para que su ASP.NET Core WebAPI responda con un objeto serializado JSON junto con el control total del código de estado, debe comenzar asegurándose de haber incluido el
AddMvc()
servicio en suConfigureServices
método que generalmente se encuentra enStartup.cs
.Si su proyecto requiere control total y desea definir estrictamente sus servicios, por ejemplo, cómo se comportará su WebAPI frente a varios tipos de solicitud, incluidos
application/json
y no responder a otros tipos de solicitud (como una solicitud de navegador estándar), puede definirlo manualmente con el siguiente código:Notarás que también he incluido una forma para que agregues tus propios formateadores de entrada / salida personalizados, en el caso de que quieras responder a otro formato de serialización (protobuf, ahorro, etc.).
El fragmento de código anterior es principalmente un duplicado del
AddMvc()
método. Sin embargo, estamos implementando cada servicio "predeterminado" por nuestra cuenta definiendo todos y cada uno de los servicios en lugar de ir con el preenviado con la plantilla. He agregado el enlace del repositorio en el bloque de código, o puede consultarloAddMvc()
desde el repositorio de GitHub. .Tenga en cuenta que hay algunas guías que tratarán de resolver esto "deshaciendo" los valores predeterminados, en lugar de simplemente no implementarlo en primer lugar ... Si considera que ahora estamos trabajando con Open Source, este es un trabajo redundante , mal código y, francamente, un viejo hábito que desaparecerá pronto.
Paso 2: crear un controlador
Te voy a mostrar una muy sencilla para resolver tu pregunta.
Paso 3: comprueba tu
Content-Type
yAccept
Debe asegurarse de que su
Content-Type
y losAccept
encabezados en su solicitud estén configurados correctamente. En su caso (JSON), querrá configurarlo para que seaapplication/json
.Si desea que su WebAPI responda como JSON de forma predeterminada, independientemente de lo que especifique el encabezado de la solicitud, puede hacerlo de dos maneras .
Forma 1 Como se muestra en el artículo que recomendé anteriormente ( Formatear datos de respuesta ), podría forzar un formato particular en el nivel Controlador / Acción. Personalmente no me gusta este enfoque ... pero aquí está para completar:
Modo 2 Mi método preferido es que WebAPI responda a todas las solicitudes con el formato solicitado. Sin embargo, en el caso de que no acepte el formato solicitado, recurra a un valor predeterminado (es decir, JSON)
Primero, deberá registrar eso en sus opciones (necesitamos modificar el comportamiento predeterminado, como se señaló anteriormente)
Finalmente, simplemente reordenando la lista de los formateadores que se definieron en el creador de servicios, el proveedor de alojamiento web adoptará el formateador que coloque en la parte superior de la lista (es decir, la posición 0).
Se puede encontrar más información en esta entrada de Blog de herramientas y desarrollo web .NET
fuente
IActionResult
conreturn Ok(new {response = "123"});
Cheers!RespectBrowserAcceptHeader
es fundamental cuando se implementa el uso de un serializador alternativo o, más comúnmente, cuando se quiere asegurar de que sus clientes no envíen solicitudes con formato incorrecto. Por lo tanto, hice hincapié en "Si su proyecto requiere control total y desea definir estrictamente su servicio" y tenga en cuenta la cita de bloque resaltada encima de esa declaración también.Tiene métodos predefinidos para los códigos de estado más comunes.
Ok(result)
vuelve200
con respuestaCreatedAtRoute
devuelve201
+ nueva URL de recursoNotFound
devoluciones404
BadRequest
devoluciones400
etc.Consulte
BaseController.cs
yController.cs
para obtener una lista de todos los métodos.Pero si realmente insiste, puede usarlo
StatusCode
para configurar un código personalizado, pero realmente no debería hacerlo, ya que hace que el código sea menos legible y tendrá que repetir el código para configurar encabezados (como paraCreatedAtRoute
).fuente
JSON
elActionResult
creado por elJson()
método. No incluye la cadena "123" directamente.Json(...)
y pase la cadena aStatusCode
Con ASP.NET Core 2.0 , la forma ideal de devolver objetos
Web API
(que está unificada con MVC y usa la misma clase baseController
) esDarse cuenta de
200 OK
código de estado (es unOk
tipo deObjectResult
)Accept
encabezado en la solicitud. SiAccept: application/xml
se envía en solicitud, regresará comoXML
. Si no se envía nada,JSON
es el valor predeterminado.Si necesita enviar con un código de estado específico , use
ObjectResult
o en suStatusCode
lugar. Ambos hacen lo mismo y admiten la negociación de contenido.o incluso más de grano fino con ObjectResult:
Si desea regresar específicamente como JSON , hay dos formas
Darse cuenta de
JSON
de dos maneras diferentes.Json(object)
.Produces()
atributo (que es aResultFilter
) concontentType = application/json
Lea más sobre ellos en los documentos oficiales . Aprende sobre los filtros aquí .
La clase de modelo simple que se utiliza en las muestras.
fuente
La forma más fácil que se me ocurrió es:
fuente
Esta es mi solución más fácil:
o
fuente
En lugar de usar códigos de estado 404/201 usando enum
fuente
¡¡¡Impresionantes respuestas que encontré aquí y también probé esta declaración de devolución
StatusCode(whatever code you wish)
, ¡¡¡y funcionó !!!fuente
Consulte el código a continuación, puede administrar múltiples códigos de estado con diferentes tipos JSON
fuente
Lo que hago en mis aplicaciones Asp Net Core Api es crear una clase que se extiende desde ObjectResult y proporcionar muchos constructores para personalizar el contenido y el código de estado. Entonces, todas mis acciones de Controlador usan uno de los costructores como corresponda. Puede ver mi implementación en: https://github.com/melardev/AspNetCoreApiPaginatedCrud
y
https://github.com/melardev/ApiAspCoreEcommerce
así es como se ve la clase (vaya a mi repositorio para obtener el código completo):
Observe la base (dto) que reemplaza dto por su objeto y debería estar listo.
fuente
Tengo esto para trabajar. Mi gran problema fue que mi json era una cadena (en mi base de datos ... y no un tipo específico / conocido).
Ok, finalmente conseguí que esto funcione.
Estoy en asp.net core 3.1
Tengo la pista de aquí :: https://www.jianshu.com/p/7b3e92c42b61
fuente