Je passe de l'API Web WCF à la nouvelle API Web ASP.NET MVC 4. J'ai un UsersController et je souhaite avoir une méthode nommée Authenticate. Je vois des exemples de la façon de faire GetAll, GetOne, Publier et Supprimer, mais que faire si je veux ajouter des méthodes supplémentaires à ces services? Par exemple, mon UsersService devrait avoir une méthode appelée Authenticate où ils transmettent un nom d'utilisateur et un mot de passe, mais cela ne fonctionne pas.
public class UsersController : BaseApiController
{
public string GetAll()
{
return "getall!";
}
public string Get(int id)
{
return "get 1! " + id;
}
public User GetAuthenticate(string userName, string password, string applicationName)
{
LogWriter.Write(String.Format("Received authenticate request for username {0} and password {1} and application {2}",
userName, password, applicationName));
//check if valid leapfrog login.
var decodedUsername = userName.Replace("%40", "@");
var encodedPassword = password.Length > 0 ? Utility.HashString(password) : String.Empty;
var leapFrogUsers = LeapFrogUserData.FindAll(decodedUsername, encodedPassword);
if (leapFrogUsers.Count > 0)
{
return new User
{
Id = (uint)leapFrogUsers[0].Id,
Guid = leapFrogUsers[0].Guid
};
}
else
throw new HttpResponseException("Invalid login credentials");
}
}
Je peux accéder à myapi / api / users / et il appellera GetAll et je peux accéder à myapi / api / users / 1 et il appellera Get, cependant si j'appelle myapi / api / users / authenticate? Username = {0} & password = {1} alors il appellera Get (NOT Authenticate) et l'erreur:
Le dictionnaire de paramètres contient une entrée nulle pour le paramètre 'id' de type non nullable 'System.Int32' pour la méthode 'System.String Get (Int32)' dans 'Navtrak.Services.WCF.NavtrakAPI.Controllers.UsersController'. Un paramètre facultatif doit être un type référence, un type Nullable ou être déclaré en tant que paramètre facultatif.
Comment puis-je appeler des noms de méthode personnalisés tels que Authenticate?
Réponses:
Par défaut, la configuration de la route suit les conventions RESTFul, ce qui signifie qu'elle n'acceptera que les noms d'action Get, Post, Put et Delete (regardez la route dans global.asax => par défaut, cela ne vous permet pas de spécifier un nom d'action => il utilise le verbe HTTP pour distribuer). Ainsi, lorsque vous envoyez une requête GET,
/api/users/authenticate
vous appelez essentiellement l'Get(int id)
action et la transmettez,id=authenticate
ce qui se bloque évidemment car votre action Get attend un entier.Si vous souhaitez avoir des noms d'action différents de ceux standard, vous pouvez modifier la définition de votre itinéraire dans
global.asax
:Vous pouvez maintenant accéder à
/api/values/getauthenticate
pour authentifier l'utilisateur.la source
{action}
que cela ait une contrainte{id}
pour que tout autre chose queint
ouGuid
(ou autre) ne corresponde pas. Ensuite, il devrait pouvoir passer à celui suggéré par DarinC'est la meilleure méthode que j'ai trouvée jusqu'à présent pour incorporer des méthodes GET supplémentaires tout en prenant en charge les méthodes REST normales. Ajoutez les routes suivantes à votre WebApiConfig:
J'ai vérifié cette solution avec la classe de test ci-dessous. J'ai pu réussir chaque méthode de mon contrôleur ci-dessous:
J'ai vérifié qu'il prend en charge les demandes suivantes:
Notez que si vos actions GET supplémentaires ne commencent pas par «Get», vous souhaiterez peut-être ajouter un attribut HttpGet à la méthode.
la source
put
etdelete
comme vous l'avez fait surget
etpost
fonctionnera bien aussi?put
ou desdelete
verbes étant donné que ces demandes seraient généralement accompagner un paramètre d'identification pour identifier la ressource que vous souhaitez appliquer cette opération. Undelete
appel à/api/foo
devrait générer une erreur car quel toto essayez-vous de supprimer? Par conséquent, la route DefaultApiWithId doit gérer ces cas correctement.Je suis dans le monde MVC4.
Pour ce que ça vaut, j'ai un SitesAPIController, et j'avais besoin d'une méthode personnalisée, qui pourrait s'appeler comme:
Avec des valeurs différentes pour le dernier paramètre pour obtenir un enregistrement avec des dispositions différentes.
Ce qui a finalement fonctionné pour moi était:
La méthode dans SitesAPIController:
Et cela dans le WebApiConfig.cs
Tant que je nommais la {disposition} comme {id} je rencontrais:
Quand je l'ai renommé en {disposition}, il a commencé à fonctionner. Donc, apparemment, le nom du paramètre correspond à la valeur de l'espace réservé.
N'hésitez pas à modifier cette réponse pour la rendre plus précise / explicative.
la source
Web Api attend par défaut qu'une URL sous la forme api / {controller} / {id} remplace ce routage par défaut. vous pouvez définir le routage avec l'une des deux méthodes ci-dessous.
Première option:
Ajouter ci-dessous l'enregistrement de l'itinéraire dans WebApiConfig.cs
Décorez votre méthode d'action avec HttpGet et les paramètres comme ci-dessous
pour appeler la méthode ci-dessus, l'URL sera comme ci-dessous
http: // localhost: [yourport] / api / MyData / ReadMyData? param1 = value1 & param2 = value2 & param3 = value3
Deuxième option Ajoutez un préfixe de route à la classe Controller et décorez votre méthode d'action avec HttpGet comme ci-dessous. Dans ce cas, il n'est pas nécessaire de modifier les WebApiConfig.cs. Il peut avoir un routage par défaut.
pour appeler la méthode ci-dessus, l'URL sera comme ci-dessous
http: // localhost: [yourport] / api / MyData / ReadMyData? param1 = value1 & param2 = value2 & param3 = value3
la source
Si vous utilisez ASP.NET 5 avec ASP.NET MVC 6 , la plupart de ces réponses ne fonctionneront tout simplement pas car vous laisserez normalement MVC créer la collection de routes appropriée pour vous (en utilisant les conventions RESTful par défaut), ce qui signifie que vous ne trouverez aucun
Routes.MapRoute()
appel à modifier à volonté.La
ConfigureServices()
méthode appelée par leStartup.cs
fichier inscrira MVC avec le framework d'injection de dépendances intégré à ASP.NET 5: de cette façon, lorsque vous appelezApplicationBuilder.UseMvc()
plus tard dans cette classe, le framework MVC ajoutera automatiquement ces routes par défaut à votre application. Nous pouvons jeter un œil à ce qui se passe derrière le capot en regardant l'UseMvc()
implémentation de la méthode dans le code source du framework:La bonne chose à ce sujet est que le framework gère maintenant tout le travail acharné, itérant à travers toutes les actions du contrôleur et en configurant leurs routes par défaut, vous évitant ainsi un travail redondant.
Le problème, c'est qu'il y a peu ou pas de documentation sur la façon dont vous pouvez ajouter vos propres routes. Heureusement, vous pouvez facilement le faire en utilisant une approche basée sur la convention et / ou une approche basée sur les attributs (également appelée routage d'attributs ).
Fondé sur la convention
Dans votre classe Startup.cs, remplacez ceci:
avec ça:
Basé sur les attributs
Un grand avantage de MVC6 est que vous pouvez également définir des routes par contrôleur en décorant la
Controller
classe et / ou lesAction
méthodes avec les paramètres appropriésRouteAttribute
et / ouHttpGet
/HttpPost
template, tels que les suivants:Ce contrôleur traitera les demandes suivantes:
Notez également que si vous utilisez les deux approches pour gheter, les routes basées sur les attributs (lorsqu'elles sont définies) remplaceront celles basées sur la Convention, et les deux remplaceront les routes par défaut définies par
UseMvc()
.Pour plus d'informations, vous pouvez également lire l'article suivant sur mon blog.
la source
public IActionResult Patch(int id, [FromQuery] Person person)
, toutes les propriétés sont nuls entrants!Consultez cet article pour une discussion plus longue sur les actions nommées. Cela montre également que vous pouvez utiliser l'attribut [HttpGet] au lieu de préfixer le nom de l'action avec "get".
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
la source
Modifiez simplement votre WebAPIConfig.cs comme ci-dessous
Ensuite, implémentez votre API comme ci-dessous
la source
Web APi 2 et les versions ultérieures prennent en charge un nouveau type de routage, appelé routage d'attributs. Comme son nom l'indique, le routage d'attributs utilise des attributs pour définir les itinéraires. Le routage d'attributs vous donne plus de contrôle sur les URI de votre API Web. Par exemple, vous pouvez facilement créer des URI qui décrivent des hiérarchies de ressources.
Par exemple:
Sera parfait et vous n'avez pas besoin de code supplémentaire par exemple dans WebApiConfig.cs. Vous devez simplement vous assurer que le routage de l'API Web est activé ou non dans WebApiConfig.cs, sinon vous pouvez l'activer comme ci-dessous:
Vous n'avez pas besoin de faire quelque chose de plus ou de changer quelque chose dans WebApiConfig.cs. Pour plus de détails, vous pouvez consulter cet article .
la source