Usando WebAPI ou MVC para retornar JSON no ASP.NET


138

Estou construindo um aplicativo ASP.NET MVC que é pesado para scripts de cliente, ele usará JSON e jQuery para manipular o DOM.

Meu entendimento é que o Web API Controller e o MVC Controller podem retornar JSON.

Dado o meu cenário, devo usar um Web API Controller ou um MVC Controller ?



1
Importante notar é que esta pergunta é específica para um determinado contexto: o autor deseja saber qual controlador usar se SOMENTE json for retornado. Uma API REST permite formatação de mídia diferente, dependendo da negociação do conteúdo (por exemplo: accept xml, accept json). Neste caso controlador WebAPI é sua melhor opção
Sentinela

Respostas:


156

Os controladores de API da Web podem ser criados e hospedados em qualquer aplicativo ASP.NET, não apenas nos aplicativos MVC. Portanto, um motivo óbvio para criar uma API da Web é se você não possui um front-end MVC (por exemplo, serviços da Web RESTful clássicos hospedados por sua empresa / organização).

Os MVC Controllers geralmente contam com o MVC Framework, se você observar os modelos padrão e a maior parte do trabalho realizado pela comunidade e seus colegas, perceberá que quase todos os MVC Controllers são implementados com a Visualização em mente.

Pessoalmente, uso Controladores MVC quando pretendo responder com uma View () e usarei uma API da Web para qualquer coisa que não dependa de uma exibição específica.

Existem advertências, é claro, mas de um modo geral, se você não exige o comportamento de Model Binding do MVC, seu serviço é centrado em dados e as operações são centradas em dados (por exemplo, operações CRUD), é provável que você queira um 'Web API Controller 'em vez de um' Model-View Controller '. Por outro lado, se suas operações são centradas na visualização (por exemplo, entregar uma página de administração do usuário ao usuário) ou você precisa da Ligação de modelo do MVC para gerar 'parciais de ajax' (muito improvável), será necessário um Controlador MVC.

Pessoalmente, uso controladores de API da Web para direcionar clientes RESTful baseados em JSON, uso controladores MVC para lidar com o roteamento básico do navegador e a entrega do SPA.


32

WebAPI é para fazer uma API. Se você deseja que alguém consuma sua API em XML, JSON etc. Você pode criar uma API da Web.

No seu caso, você só precisa conversar com o cliente em JSON.

Mesmo que seu site seja principalmente orientado por scripts de cliente, você ainda estaria usando o ASP.NET MVC Controller, certo? E como você já pode ter dividido logicamente seus controladores com base em entidades, faz sentido adicionar esses métodos de serviço json nele, em vez de criar outra classe especificamente para API da Web.

Portanto, para sua situação específica (se bem entendi), eu ficaria com os Controladores.


Obrigado, existe uma diferença em como criamos WebAPI vs Controller?
Nil Pun

1
@flybyte sim você precisa derivar de ApiController, consulte asp.net/web-api/overview/getting-started-with-aspnet-web-api/...
Muhammad Hasan Khan

4
A API da Web pode executar JSON, assim como os outros métodos listados. Os controladores não podem (ordenadamente) ser transformados em uma API. Portanto, dado que o usuário está com a previsão de perguntar - eu sugiro usar a solução mais escalável / flexível. Não é como se fosse um serviço WCF da velha escola, a API da Web geralmente é poderosa e flexível. Portanto, embora você precise apenas de cenários simples, ele fica fora do seu caminho. Mas você tem o poder se precisar dele
steve

8

A resposta se resume à separação de preocupações, agiliza a criação de serviços e depende da convenção e não da configuração.

A principal responsabilidade dos controladores é trabalhar como coordenador entre a visualização e o seu modelo, mas onde a principal responsabilidade da API é trabalhar com dados. No caso das convenções da API, é realmente fácil executar operações CRUD. Abaixo está o mapeamento entre a operação CRUD e as ações HTTP

  • GET: Read
  • POST: Criar
  • PUT: Atualização
  • DELETE: Delete

Portanto, com as APIs, você não precisa criar ações separadas e atribuí-las a ações HTTP.


0

A única preocupação que tenho com o ApiController é que ele é baseado no site e não na área. Um site pode ter apenas uma subpasta apicontroller para você nomear seus métodos de controlador. Há situações em que você pode duplicar o nome do controlador em diferentes áreas:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Lembro que existem algumas configurações de código personalizadas para fazer isso, mas ele não funciona por padrão.


isso parece um comentário, não uma resposta.
Dylan Hayes

Não faça realmente o que você está dizendo. Se você nomear um controlador Area1XController, poderá fazer: domain.com/Area1X/1, crie um controlador: Area2XController e acesse-o com: domain.com/Area2X/1. A grande questão é por que você quer fazer isso de qualquer maneira. O nome da área é abstrato e não diz nada ao usuário. Se você digitou 4 Áreas, é melhor usar o nome da finalidade funcional para ele.
Herman Van Der Blom

0

Concordo com a resposta (resposta principal) de Shaun Wilson, mas não sei por que, como estou um pouco confuso e ainda estou tentando entender com a seguinte premonição (provavelmente incorreta):

  • Use o WebAPI Controller para entregar dados JSON ao cliente para que ele possa manipular a manipulação da visualização. Esse processo NÃO requer uma visualização, mas apenas uma resposta para o que chamamos de método (ou seja, uma solicitação de javascript), para que o cliente possa lidar com qualquer manipulação do lado do cliente.
  • Use o controlador MVC quando precisar usar os dados para manipular uma exibição durante ou logo após o carregamento da página (ou seja, não para aplicativos SPA).

Veja bem, eu simplesmente não sei como estou incorreto aqui e estou confuso porque a última linha da resposta de Shaun declara "Eu uso controladores MVC para lidar com o roteamento básico do navegador e a entrega do SPA". - talvez eu não saiba completamente o que é um cliente tranqüilo quando presumi que poderia ser o método JavaScript que recebe uma resposta no formato JSON. esta é a postagem mais próxima do Stackoverflow que foi remotamente relacionada como resposta à minha pergunta, por isso estou respondendo a essa postagem em vez de possivelmente duplicar perguntas.


" Use o controlador MVC para entregar a View ", você pode agrupar o SPA em parciais MVC para composição em uma View. Os desenvolvedores do ASP.NET MVC devem entender esse conceito. Você pode utilizar os recursos regulares do Razor + ASP.NET durante a geração da exibição (por exemplo, processamento no servidor) para renderizar HTML + JS para o cliente. o problema que muitos desenvolvedores enfrentarão aqui é a idéia de que arquivos HTML + JS estáticos não são o que fazem de um SPA um SPA. Às vezes, o conteúdo precisa ser dinâmico e específico para o usuário, mas todas as estruturas tendem a prejudicar esse fato. "SPA" e "MVC" não são mutuamente exclusivos.
Shaun Wilson

0

Nesse cenário, eu recomendaria o WebApi, pois é perfeito para transferir dados como esse com base em solicitações de Javascript. Normalmente, desenvolverei meus controladores WebApi para que eles retornem um objeto amigável para JSON que possa ser analisado facilmente pelo meu Javascript.

O único tempo real em que você desejaria usar uma ação em um controlador MVC para esse tipo de coisa seria se você desejasse gerar algum HTML e substituir segmentos da sua página por chamadas Javascript.

Por exemplo:

Você tem um Datepicker da UI do JQuery que, após a seleção, gera uma lista de botões de opção que representam eventos no dia escolhido.

Nesse cenário, você pode usar o WebApi para retornar algum JSON e, em seguida, gerar o HTML necessário usando Javascript, mas geralmente é uma prática inadequada criar muito HTML usando Javascript. Seria muito melhor que o C # construísse o HTML e depois o retornasse através de uma exibição parcial, pois dessa forma é menos provável que você encontre erros na análise do Javascript. Sem mencionar que torna o HTML muito mais fácil de escrever.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.