Estou procurando a maneira correta de retornar JSON com um código de status HTTP no meu controlador de API Web do .NET Core. Eu uso para usá-lo assim:
public IHttpActionResult GetResourceData()
{
return this.Content(HttpStatusCode.OK, new { response = "Hello"});
}
Isso estava em um aplicativo MVC 4.6, mas agora com o .NET Core não parece ter isso e IHttpActionResult
tenho o ActionResult
seguinte:
public ActionResult IsAuthenticated()
{
return Ok(Json("123"));
}
Mas a resposta do servidor é estranha, como na imagem abaixo:
Eu só quero que o controlador da API da Web retorne JSON com um código de status HTTP, como fiz na API da Web 2.
c#
json
asp.net-core
asp.net-core-webapi
Rossco
fonte
fonte
CreatedAtRoute
método etc.Respostas:
A versão mais básica que responde com a
JsonResult
é:No entanto, isso não ajudará no seu problema, porque você não pode lidar explicitamente com seu próprio código de resposta.
por exemplo:
Observe que os dois exemplos acima vieram de um ótimo guia disponível em Documentação da Microsoft: Formatando dados de resposta
Coisas extras
O problema que me deparo com frequência é que eu queria um controle mais granular sobre minha WebAPI, em vez de apenas ir com a configuração de padrões do modelo "New Project" no VS.
Vamos garantir que você tenha alguns princípios básicos ...
Etapa 1: configurar seu serviço
Para que sua ASP.NET Core WebAPI responda com um Objeto serializado JSON ao longo do controle total do código de status, você deve começar por incluir o
AddMvc()
serviço em seuConfigureServices
método normalmente encontrado emStartup.cs
.Se seu projeto requer controle total e você deseja definir estritamente seus serviços, como o comportamento da sua WebAPI com vários tipos de solicitação, incluindo
application/json
e não respondendo a outros tipos de solicitação (como uma solicitação padrão do navegador), você pode defini-lo manualmente com o código a seguir:Você notará que eu também incluí uma maneira de adicionar seus próprios formatadores de entrada / saída personalizados, caso você queira responder a outro formato de serialização (protobuf, thrift etc.).
O pedaço de código acima é basicamente uma duplicata do
AddMvc()
método. No entanto, estamos implementando cada serviço "padrão" por conta própria, definindo cada serviço em vez de ir com o serviço pré-enviado com o modelo. Eu adicionei o link do repositório no bloco de código, ou você pode fazer o check-outAddMvc()
no repositório do GitHub. .Observe que existem alguns guias que tentarão resolver isso "desfazendo" os padrões, em vez de simplesmente não implementá-lo ... Se você considerar que agora estamos trabalhando com código aberto, este é um trabalho redundante , código ruim e francamente um velho hábito que desaparecerá em breve.
Etapa 2: Criar um Controlador
Vou mostrar uma pergunta realmente direta apenas para esclarecer sua dúvida.
Etapa 3: verifique seu
Content-Type
eAccept
Você precisa garantir que seus cabeçalhos
Content-Type
e os deAccept
sua solicitação estejam definidos corretamente. No seu caso (JSON), você desejará configurá-lo para serapplication/json
.Se você deseja que sua WebAPI responda como JSON como padrão, independentemente do que o cabeçalho da solicitação está especificando, você pode fazer isso de duas maneiras .
Caminho 1 Como mostrado no artigo que eu recomendei anteriormente ( Formatação de dados de resposta ), você pode forçar um formato específico no nível do controlador / ação. Pessoalmente, não gosto dessa abordagem ... mas aqui está a questão:
Caminho 2 Meu método preferido é o WebAPI responder a todas as solicitações com o formato solicitado. No entanto, caso ele não aceite o formato solicitado, retorne ao padrão (por exemplo, JSON)
Primeiro, você precisará registrar isso em suas opções (precisamos refazer o comportamento padrão, conforme observado anteriormente)
Por fim, simplesmente reordenando a lista dos formatadores que foram definidos no construtor de serviços, o host padrão será o formatador que você posicionar no topo da lista (ou seja, posição 0).
Mais informações podem ser encontradas nesta entrada do blog .NET Web Development and Tools
fonte
IActionResult
com oreturn Ok(new {response = "123"});
Cheers!RespectBrowserAcceptHeader
é fundamental ao implementar o uso de um serializador alternativo ou, mais comumente, quando você deseja garantir que seus clientes não estejam enviando solicitações malformadas. Por isso, enfatizei "Se o seu projeto requer controle total e você deseja definir estritamente o seu serviço", observe também a citação em bloco destacada acima dessa declaração.Você tem métodos predefinidos para os códigos de status mais comuns.
Ok(result)
retorna200
com respostaCreatedAtRoute
retorna201
+ novo URL do recursoNotFound
retorna404
BadRequest
retorna400
etc.Veja
BaseController.cs
eController.cs
para uma lista de todos os métodos.Mas se você realmente insistir, pode usar
StatusCode
para definir um código personalizado, mas não deve, pois isso torna o código menos legível e você terá que repetir o código para definir cabeçalhos (como paraCreatedAtRoute
).fonte
JSON
oActionResult
criado peloJson()
método. Não inclui a sequência "123" diretamente.Json(...)
passar a corda para #StatusCode
Com o ASP.NET Core 2.0 , a maneira ideal de retornar o objeto
Web API
(que é unificado ao MVC e usa a mesma classe baseController
) éNotar que
200 OK
código de status (é umOk
tipo deObjectResult
)Accept
cabeçalho da solicitação. SeAccept: application/xml
for enviado a pedido, retornará comoXML
. Se nada for enviado,JSON
é o padrão.Se precisar enviar com código de status específico , use
ObjectResult
ou emStatusCode
vez disso. Ambos fazem a mesma coisa e suportam a negociação de conteúdo.ou ainda mais refinado com ObjectResult:
Se você deseja retornar especificamente como JSON , existem duas maneiras
Notar que
JSON
de duas maneiras diferentes.Json(object)
.Produces()
atributo (que é aResultFilter
) comcontentType = application/json
Leia mais sobre eles nos documentos oficiais . Aprenda sobre filtros aqui .
A classe de modelo simples usada nas amostras
fonte
A maneira mais fácil de criar é:
fonte
Esta é a minha solução mais fácil:
ou
fonte
Em vez de usar códigos de status 404/201 usando enum
fonte
Respostas impressionantes que encontrei aqui e também tentei esta declaração de retorno ver
StatusCode(whatever code you wish)
e funcionou !!!fonte
Consulte o código abaixo, você pode gerenciar vários códigos de status com diferentes tipos JSON
fonte
O que faço em meus aplicativos Asp Net Core Api é criar uma classe que se estende do ObjectResult e fornecer muitos construtores para personalizar o conteúdo e o código de status. Então todas as minhas ações do Controller usam um dos costrutores conforme apropriado. Você pode dar uma olhada na minha implementação em: https://github.com/melardev/AspNetCoreApiPaginatedCrud
e
https://github.com/melardev/ApiAspCoreEcommerce
aqui está como a classe se parece (vá ao meu repositório para obter o código completo):
Observe a base (dto) que você substitui dto pelo seu objeto e você deve estar pronto.
fonte
Eu fiz isso funcionar. Meu grande problema foi que meu json era uma string (no meu banco de dados ... e não um tipo específico / conhecido).
Ok, finalmente consegui que isso funcionasse.
Eu estou no asp.net core 3.1
Eu tenho a dica a partir daqui :: https://www.jianshu.com/p/7b3e92c42b61
fonte