web-dev-qa-db-fra.com

API Web 2 GET par paramètre de requête

Je vais passer de mon service WCF Rest/Json à WebApi2 et je cherche un moyen de mapper cette méthode:

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "Users?mail={mail}&pw={pw}")]
UserData getUserByEmailAndPw(String mail);

Je souhaite interroger un utilisateur par e-mail et mot de passe afin que je ne puisse pas utiliser le GET par défaut qui est destiné à utiliser un ID. Autant que je sache, vous devriez le faire via des attributs dans Rest ...

Dois-je simplement enregistrer un itinéraire pour cela ou y a-t-il un meilleur moyen (peut-être par convention)?

10
stefan

Vous devez toujours enregistrer un itinéraire dans WebApi pour vos actions de contrôleur, cela peut être fait avec routage d'attribut ou avec - routage basé sur les conventions .

Les paramètres passés dans la chaîne de requête pour la requête GET n'ont pas vraiment besoin d'être spécifiés explicitement dans aucune des méthodes de configuration de routage.

Les paramètres que vous spécifiez sur l'action de votre contrôleur sont mappés aux paramètres envoyés dans la chaîne de requête d'une demande GET.

Si vous utilisez la configuration basée sur les conventions WebApi par défaut où les routes sont configurées quelque chose comme ceci:

var config = new HttpConfiguration();
// some other config setup for web api
...
...
// route config
config.Routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Ensuite, un contrôleur comme celui-ci fonctionnera pour vous:

public class UsersController : ApiController {
   // this maps to a get requests to:
   // domain/api/users
   // and domain/api/users?id=someid
   // and domain/api/users?mail=somemail
   // and domain/api/users?pw=somepw
   // and domain/api/users?mail=somemail&pw=somepw
   // and domain/api/users with any query string really
   [HttpGet]
   public IHttpActionResult Get(string mail, string pw) {
      // should probably check mail and pw for empty strings and nulls
      var users = SomeStaticExampleService.FindByMailAndPw(mail, pw);
      return this.Json(users);
   }
}

Vous pouvez également utiliser le routage d'attributs, puis appeler vos contrôleurs et méthodes d'action comme bon vous semble. Configurez vos itinéraires comme ceci:

var config = new HttpConfiguration();
// some other config setup for web api
...
...
// route config
config.MapHttpAttributeRoutes();

Ensuite, vous pouvez créer un contrôleur comme celui-ci:

public class FooController : ApiController {
   // this maps to a get requests to:
   // domain/users
   // and domain/users?id=someid
   // and domain/users?mail=somemail
   // and domain/users?pw=somepw
   // and domain/users with any query string really
   [HttpGet]
   [Route("users")]
   public IHttpActionResult Bar(string mail, string pw) {
      // should probably check mail and pw for empty strings and nulls
      var users = SomeStaticExampleService.FindByMailAndPw(mail, pw);
      return this.Json(users);
   }
}

Gardez à l'esprit cependant qu'avec Routage d'attributs , vous devez faire attention à ne pas créer de routes conflictuelles sinon WebApi ne saura pas vers quel contrôleur et quelle action acheminer une demande lorsqu'un itinéraire est mappé à plusieurs méthodes d'action.

J'ai utilisé this.Json dans ces exemples pour renvoyer une réponse http avec un contenu json correspondant à votre wcf ResponseFormat = WebMessageFormat.Json. Mais vous pouvez bien sûr simplement renvoyer un type [~ # ~] clr [~ # ~] :

   [HttpGet]
   [Route("users")]
   public IEnumerable<MyUser> Bar(string mail, string pw) {
      // should probably check mail and pw for empty strings and nulls
      var users = SomeStaticExampleService.FindByMailAndPw(mail, pw);
      return users;
   }

et laissez WebApi négociation de conten gérer le type de contenu du message de réponse.

15
Anish Patel