Comment utiliser ActionResults dans l'API Web

L'API Web ASP.Net est une infrastructure légère utilisée pour créer des services HTTP sans état et RESTful. Vous pouvez tirer parti des résultats d'action dans l'API Web pour renvoyer des données à partir des méthodes du contrôleur d'API Web.

Commencer

Créons d'abord un projet d'API Web. Pour ce faire, créez un projet ASP.Net vide dans Visual Studio 2015 et cochez la case API Web lors de la sélection du modèle de projet. Ensuite, enregistrez le projet avec un nom.

Vous remarquerez qu'un projet ASP.Net vide est créé. Cliquez avec le bouton droit sur le dossier de la solution Contrôleurs et cliquez sur Ajouter -> Contrôleur pour créer un nouveau contrôleur API Web. Sélectionnez le "Contrôleur Web API 2 - Vide" lorsque vous y êtes invité dans la fenêtre qui apparaît ensuite. Enregistrez le contrôleur avec un nom. Supposons que le nom du contrôleur pour cet exemple est "DefaultController".

Créons une classe d'entité nommée Contact.

public class Contact

    {

        public int Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

Ensuite, ajoutez la méthode suivante à DefaultController.

public CustomActionResult Get()

        {

            Contact contact = new Contact();

            contact.Id = 1;

            contact.FirstName = "Joydip";

            contact.LastName = "Kanjilal";

            return new CustomActionResult(HttpStatusCode.OK, contact);

        }

Notez l'utilisation de la classe CustomActionResult lors du renvoi des données de la méthode du contrôleur. Créons maintenant une classe CustomActionResult juste pour nous assurer que votre code se compile - nous implémenterons cette classe plus tard.

public class CustomActionResult : IHttpActionResult

    {

        public Task ExecuteAsync(CancellationToken cancellationToken)

        {

            throw new NotImplementedException();

        }

    }

Travailler avec ActionResults

Votre contrôleur d'API Web peut renvoyer l'un des types de valeur suivants:

  • HttpResponseMessage: dans ce cas, votre API Web convertira la valeur de retour en un objet de message de réponse Http et la renverra.
  • IHttpActionResult: dans ce cas, le runtime de l'API Web convertit la valeur de retour en un objet de message de réponse Http (une instance HttpResponseMessage est créée de manière asynchrone) en interne et la renvoie. L'utilisation de l'interface IHttpActionResult (introduite dans l'API Web 2) simplifie les tests unitaires de vos contrôleurs d'API Web et encapsule également la création d'un objet HttpResponseMessage.
  • void: dans ce cas, votre API Web renverrait une réponse Http vide avec un code d'état 204.
  • Autres types: dans ce cas, votre API Web tirerait parti du formateur de média approprié pour sérialiser et renvoyer les données à partir de la méthode du contrôleur API Web avec un code d'état de réponse de 200.

L'extrait de code suivant montre comment vous pouvez utiliser return HttpResponseMessage à partir de votre méthode de contrôleur d'API Web.

 [Route("contact")]

public HttpResponseMessage Get()

{

    HttpResponseMessage message = Request.CreateResponse(HttpStatusCode.OK, contact);

    return message;

}

Implémentons maintenant un résultat d'action personnalisé que nous utiliserons pour renvoyer les données de l'API Web que nous avons créée.

Création d'un ActionResult personnalisé

Pour créer une classe de résultat d'action personnalisée, il vous suffit de créer une classe qui implémente l'interface IActionResult et remplace la méthode ExecuteAsync.

L'extrait de code suivant montre comment utiliser Generics pour créer une classe de résultat d'action personnalisée.

public class CustomActionResult : IHttpActionResult

    {

        private System.Net.HttpStatusCode statusCode;

        T data;

        public CustomActionResult(System.Net.HttpStatusCode statusCode, T data)

        {

            this.statusCode = statusCode;

            this.data = data;

        }

    }

L'extrait de code suivant montre comment créer l'objet de réponse, le remplir avec les données nécessaires et le renvoyer.

public HttpResponseMessage CreateResponse(System.Net.HttpStatusCode statusCode, T data)

        {

            HttpRequestMessage request = new HttpRequestMessage();            request.Properties.Add(System.Web.Http.Hosting.HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());

            HttpResponseMessage response = request.CreateResponse(statusCode, data);

            return response;

        }

La méthode ExecuteAsync appelle la méthode CreateResponse et lui transmet le code d'état et les données en tant que paramètre.

        public Task ExecuteAsync(CancellationToken cancellationToken)

        {

            return Task.FromResult(CreateResponse(this.statusCode, this.data));

        }

Consommer l'API Web

Pour consommer l'API Web que vous venez de créer, vous pouvez créer une application console puis importer le package "WebApiContrib.Formatting.ProtoBuf" dans votre projet via NuGet.

En supposant que vous ayez créé le client pour consommer l'API Web que nous avons implémentée précédemment, voici la liste de code qui montre comment vous pouvez consommer l'API Web.

static void Main(string[] args)

        {

            var client = new HttpClient { BaseAddress = new Uri("//localhost:37019/") };

            HttpResponseMessage response = client.GetAsync("api/Default").Result;

            if (response.IsSuccessStatusCode)

            {

                Contact contact = response.Content.ReadAsAsync().Result;

                Console.WriteLine("Id = "+ contact.Id + " First Name: " + contact.FirstName + " Last Name: " + contact.LastName);

            }

            else

            {

                Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);

            }

            Console.ReadKey();

        }