Comment une méthode MVC WebApi carte à un verbe http?
Dans la vidéo de 5 minutes sur le lien suivant, au 1:10 marque, Jon Galloway dit que l'ajout d'une méthode appelée DeleteComment à son CommentsController contrôleur de classe par la convention de la carte automatiquement à la suppression http verbe.
Comment MVC avec WebApi savoir comment faire pour mettre en déroute les méthodes pour le droit des verbes? Je sais que le routage dans le monde.asax.cs fichier achemine les requêtes vers le contrôleur correct, mais comment fait une demande de suppression d'obtenir "mappé par convention" pour la méthode de suppression, ou toute autre méthode? Surtout quand il peut y avoir plus de 1 méthode pour chaque verbe? "Par convention" me fait penser que c'est seulement en regardant le premier mot d'un nom de méthode ... mais si oui, il aurait à lire la signature des méthodes de dire deux supprimer des méthodes ou des deux méthodes get en dehors ... et où tout cela est-il défini?
Vidéo:
http://www.asp.net/web-api/videos/getting-started/delete-and-update
Merci!
Edit:
Voici le code dans l'exemple de classe ValuesController qui vient dans la WebApi modèle. C'est l'origine de ma question initiale. Comment fonctionne la "convention" qui fait la différence entre ceux-ci (et de toute autre méthode dans le contrôleur) de travail?
//GET /api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
//GET /api/values/5
public string Get(int id)
{
return value;
}
- Dans WebApi je pense que vous êtes censé avoir un contrôleur par des ressources de sorte que vous n'avez pas supprimer deux méthodes.
- Merci Shane, c'est la bonne info, mais ce que je veux dire, c'est précisément comme une seule méthode d'enregistrement et un multiples-méthode d'enregistrement. OBTENIR est probablement plus approprié de les exemple, mais vous pouvez avoir une méthode qui obtient un enregistrement par un ID, et un autre qui obtient tous les records avec une certaine FK. Mais ils sont tous les deux en utilisant le verbe GET; je ne comprends pas d'où le routage de l'intelligence qui discerne entre ces existe.
Vous devez vous connecter pour publier un commentaire.
Je m'excuse à l'avance, ce post s'éloigne un peu de ce que vous avez demandé, mais tout cela bouillonnait quand j'ai lu votre question.
WebAPI Appariement Sémantique
L'appariement sémantique utilisé par (le par défaut routes) WebAPI est assez simple.
Donc dans votre exemple de code d'une requête GET sans paramètre correspond à la
Get*( )
fonction sans paramètres. Un contenant et ID recherche unGet***(int id)
.Exemples
Alors que l'appariement sémantique est simple, elle crée une certaine confusion pour MVC développeurs (bien au moins ce développeur). Regardons quelques exemples :
Bizarre Noms - Votre méthode get peut être nommé n'importe quoi, tant que ça commence par "get". Ainsi, dans le cas d'un widget contrôleur, vous pouvez nommer vos fonctions
GetStrawberry()
et il sera toujours appariés. Pensez à la correspondance que quelque chose comme :methodname.StartsWith("Get")
Plusieurs Méthodes d'Appariement - Ce qui arrive si vous disposez de deux méthodes Get sans paramètres?
GetStrawberry()
etGetOrange()
. Du mieux que je peux dire, la fonction définie à la première (en haut du fichier) dans votre code gagne ...étrange. Cela a pour effet secondaire de faire certaines méthodes dans votre contrôleur inaccessible (au moins avec les routes par défaut)....étranger.Que faire?
Eh bien, WebAPI est nouveau, et le consensus est toujours la coalescence. La communauté semble être atteint pour le REPOS des principes tout à fait un peu. Pourtant, pas tous les API peut ou devrait être paisible, certains sont plus naturellement exprimée dans un style RPC. RESTE & que les gens appellent le RESTE semble être la source de un peu de la confusion, bien au moins à Roy Fielding.
Comme un pragmatique, je pense que nombre d'API sera de 70% Reposante, avec une poignée de type RPC méthodes. Tout d'abord, le contrôleur de la prolifération seul (compte tenu de la webapi méthode de reliure) va conduire les développeurs de dingue. Deuxièmement, WebAPI n'a pas vraiment intégré dans la façon de créer une structure imbriquée des api chemins (ce qui signifie:
/api/controller/
est facile, mais/api/CATEGORY/Sub-Category/Controller
est faisable, mais une douleur).De mon point de vue, j'aimerais voir la webAPI structure de dossier de contrôle de la valeur par défaut de l'API chemins... de sens que si je créer un dossier de Catégorie dans mon INTERFACE puis
/api/Category
serait le chemin d'accès par défaut (quelque chose parallèlement à cette MVC article).Qu'ai-je fait?
Donc, j'avais quelques exigences: (1) pour être en mesure d'utiliser reposant syntaxe dans la plupart des cas, (2) d'avoir un peu d'espace de noms" séparation des contrôleurs (pensez à les sous-dossiers), (3) être en mesure d'appeler d'autres rpc-comme des méthodes si nécessaire. La mise en œuvre de ces exigences est descendu à intelligent de routage.
Namespace
données jeton, pour limiter ce que les classes sont recherchées pour un itinéraire particulier. Cela correspond bien aux caractéristiques de l'espace de noms de la configuration que vous ajouter des dossiers à la une de l'INTERFACE.Dit D'Une Autre Manière
Ma solution est venue vers le bas pour séparer les contrôleurs un peu plus
/api/XXXX
n'ai pas trop encombré.Category1
), et de mettre contrôleurs d'api dans le dossier.Widget1
dans leCategory1
dossier devient un espace de noms par défaut deUI.Category1.Widget1
./api/Category1/Widget
). La première carte que vous voyez ci-dessus accomplit que par le codage en dur des/api/Category1
dans la route, puis lanamespace
jeton restreint de classes qui vont être recherchés pour la correspondance du contrôleur.Get
actions avec l'attribut de routage.Cela arrive assez souvent. Et il y a différents points de vue sur cette. Personnellement, je n'ai pas souscrit à aucune idée pour l'instant mais il semble que l'un avec un contrôleur-par-ressource pour être le plus populaire parmi le RESTE de la communauté.
Donc, fondamentalement, vous pouvez:
action
similaire à MVC), mais ce n'est généralement pas destinés à être utilisés.