Utilisation de WebAPI ou MVC pour renvoyer JSON dans ASP.NET

138

Je construis une application ASP.NET MVC qui est lourde de script client, elle utilisera JSON et jQuery pour manipuler le DOM.

Ma compréhension est que Web API Controller et MVC Controller peuvent renvoyer JSON.

Compte tenu de mon scénario, dois-je utiliser un contrôleur API Web ou un contrôleur MVC ?

Nil Pun
la source
1
Il est important de noter que cette question est spécifique à un certain contexte: l'auteur veut savoir quel contrôleur utiliser si UNIQUEMENT json doit être retourné. Une API REST permet différents formats de média en fonction de la négociation du contenu (par exemple: accepter xml, accepter json). Dans ce cas, le contrôleur WebAPI est votre meilleure option
Sentinel

Réponses:

156

Les contrôleurs API Web peuvent être créés et hébergés dans n'importe quelle application ASP.NET, pas seulement dans les applications MVC. Ainsi, une raison évidente de créer une API Web est si vous ne disposez pas d'un frontal MVC (par exemple, des services Web classiques RESTful hébergés par votre entreprise / organisation).

Les contrôleurs MVC s'appuient généralement sur MVC Framework, si vous regardez les modèles par défaut et la plupart du travail effectué par la communauté et vos pairs, vous remarquerez que presque tous les contrôleurs MVC sont implémentés avec la vue à l'esprit.

Personnellement, j'utilise des contrôleurs MVC lorsque j'ai l'intention de répondre avec une vue (), et j'utiliserai une API Web pour tout ce qui ne dépend pas d'une vue particulière.

Il y a des mises en garde, bien sûr, mais de manière générale, si vous n'avez pas besoin du comportement de liaison de modèle de MVC, votre service est centré sur les données et les opérations sont centrées sur les données (par exemple, les opérations CRUD), vous voudrez probablement un contrôleur d'API Web 'au lieu d'un' Model-View Controller '. Inversement, si vos opérations sont centrées sur la vue (par exemple, fournir une page d'administration utilisateur à l'utilisateur), ou si vous avez besoin de la liaison de modèle de MVC pour générer des `` partiels ajax '' (très peu probable), vous voudrez plutôt un contrôleur MVC.

Personnellement, j'utilise des contrôleurs d'API Web pour piloter des clients RESTful basés sur JSON, j'utilise des contrôleurs MVC pour gérer le routage de base du navigateur et la livraison du SPA.

Shaun Wilson
la source
32

WebAPI sert à créer une API. Si vous voulez que quelqu'un puisse utiliser votre API en XML, JSON, etc. Vous pouvez créer une API Web.

Dans votre cas, vous n'avez besoin de parler au client qu'en JSON.

Même si votre site Web est principalement piloté par un script client, vous utiliseriez toujours ASP.NET MVC Controller, n'est-ce pas? Et comme vous avez peut-être déjà divisé logiquement vos contrôleurs en fonction d'entités, il est logique d'ajouter ces méthodes de service json au lieu de créer une autre classe spécifiquement pour les API Web.

Donc, pour votre situation particulière (si je comprends bien), je m'en tiendrai aux contrôleurs.

Muhammad Hasan Khan
la source
Merci, y a-t-il une différence dans la façon dont nous créons WebAPI vs Controller?
Nil Pun
1
@flybyte oui, vous devez dériver d'ApiController, voir asp.net/web-api/overview/getting-started-with-aspnet-web-api
Muhammad Hasan Khan
4
Web Api peut utiliser JSON, ainsi que les autres méthodes que vous répertoriez. Les contrôleurs ne peuvent pas (proprement) être transformés en API, donc étant donné que l'utilisateur a la clairvoyance de demander - je suggérerais d'utiliser la solution la plus évolutive / flexible. Ce n'est pas comme si c'était comme les services WCF à l'ancienne, l'api Web est généralement à la fois puissante et flexible. Ainsi, même si vous n'avez besoin que de scénarios simples, cela ne vous gêne pas. BUt vous avez le pouvoir si vous en avez besoin
steve
8

La réponse se résume à la séparation des préoccupations, à accélérer la création de services et à s'appuyer sur la convention plutôt que sur la configuration.

La responsabilité principale des contrôleurs est de travailler en tant que coordinateur entre la vue et votre modèle, mais la responsabilité principale de l'API est de travailler sur les données. Dans le cas des conventions de l'API, il est très facile d'effectuer des opérations CRUD. Voici le mappage entre l'opération CRUD et les actions HTTP

  • OBTENIR: Lire
  • POST: Créer
  • PUT: mise à jour
  • SUPPRIMER: Supprimer

Ainsi, avec les API, vous n'avez pas besoin de créer des actions séparées et de les attribuer avec des actions HTTP.

Kris
la source
0

Le seul problème que j'ai avec ApiController est qu'il est basé sur le site et non sur la zone. Un site ne peut avoir qu'un seul sous-dossier apicontroller pour que vous puissiez nommer vos méthodes de contrôleur. Dans certaines situations, vous souhaiterez peut-être dupliquer le nom du contrôleur dans différentes zones:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Je me souviens qu'il existe des paramètres de code personnalisés pour pouvoir le faire, mais cela ne fonctionne pas par défaut.

Ramon Chan
la source
cela semble être un commentaire, pas une réponse.
Dylan Hayes
Ne pas vraiment ce que vous dites. Si vous nommez un contrôleur Area1XController, vous pouvez faire: domain.com/Area1X/1, créer un contrôleur: Area2XController, puis y accéder avec: domain.com/Area2X/1. La grande question est de savoir pourquoi vous voulez faire cela de toute façon. Le nom de la zone est abstrait, il ne dit rien à un utilisateur. Si vous avez disons 4 zones, il est préférable d'utiliser le nom de la fonction fonctionnelle pour cela.
Herman Van Der Blom
0

Je suis d'accord avec la réponse de Shaun Wilson (première réponse) mais je ne sais pas pourquoi car je suis juste un peu confus et j'essaie toujours de comprendre la prémonition suivante (probablement incorrecte) -

  • Utilisez WebAPI Controller pour fournir des données JSON au client afin que le client puisse gérer la manipulation de vue. Ce processus ne nécessite PAS de vue mais plutôt simplement une réponse à ce que l'on appelle la méthode (c'est-à-dire une requête javascript) afin que le client puisse gérer toute manipulation côté client.
  • Utilisez le contrôleur MVC lorsque vous devez utiliser les données pour manipuler une vue pendant ou juste après page_load (c'est-à-dire pas pour les applications SPA).

Vous voyez, je ne sais tout simplement pas comment je me trompe ici et je suis confus parce que la dernière ligne de la réponse de Shaun déclare "J'utilise des contrôleurs MVC pour gérer le routage de base du navigateur et la livraison du SPA." - peut-être que je ne sais pas tout à fait ce qu'est un client reposant quand j'ai supposé qu'il pouvait s'agir d'une méthode JavaScript qui recevait une réponse sous forme JSON. il s'agit du message le plus proche de Stackoverflow qui était lié à distance en tant que réponse à ma question, je réponds donc à ce message au lieu de dupliquer éventuellement des questions.

RH Thorne
la source
" Utiliser le contrôleur MVC pour fournir la vue ", vous pouvez envelopper le SPA dans des partiels MVC pour la composition dans une vue. Les développeurs ASP.NET MVC doivent comprendre ce concept. Vous pouvez utiliser les fonctionnalités régulières de Razor + ASP.NET pendant la génération de vues (par exemple, traitement côté serveur) pour rendre HTML + JS au client. le problème que de nombreux développeurs vont rencontrer ici est l'idée que les fichiers HTML + JS statiques ne sont pas ce qui fait d'un SPA un SPA. parfois, le contenu doit être dynamique et spécifique à l'utilisateur, mais tous les cadres ont tendance à nuire à ce fait. «SPA» et «MVC» ne s'excluent pas mutuellement.
Shaun Wilson
0

Dans ce scénario, je recommanderais WebApi car il est parfait pour transférer des données comme celle-ci en fonction de requêtes Javascript. Je développerai généralement mes contrôleurs WebApi afin qu'ils renvoient un objet convivial JSON qui peut ensuite être analysé facilement par mon Javascript.

Le seul temps réel où vous voudriez utiliser une action sur un contrôleur MVC pour ce genre de chose serait si vous vouliez générer du HTML et remplacer des segments de votre page par des appels Javascript.

Par exemple:

Vous disposez d'un sélecteur de date de l'interface utilisateur JQuery qui, lors de la sélection, génère une liste de boutons radio qui représentent les événements du jour choisi.

Dans ce scénario, vous pouvez utiliser WebApi pour renvoyer du JSON, puis générer le HTML nécessaire en utilisant Javascript, mais il est généralement déconseillé de créer beaucoup de HTML en utilisant Javascript. Il serait préférable que C # compile le HTML et le renvoie ensuite via une vue partielle, car de cette façon, vous risquez moins de rencontrer des erreurs avec l'analyse Javascript. Sans oublier que cela rend le HTML beaucoup plus facile à écrire.

jezzipin
la source