Aller au contenu principal

27-3 Action Show du contrôleur d'API

Pour obtenir un événement, il nous faut une action d'API retournant cet événement.

Pour ce faire, on peut créer une nouvelle action dans le contrôleur d'API nommée Show.

À noter que l'utilisation de Show fait peut-être moins de sens à première vue que dans un projet MVC où l'action Show du contrôleur retourne une vue du même nom. Cependant, on désir tout de même "montrer" un événement, seulement que ce sera sous forme de données JSON.

Par souci de constance, on conservera la même nomenclature.

Créer l'action Show

Snowfall.Web.Api/Controllers/EvenementsController.cs
/// <summary>
/// GET /api/evenements/id
/// Récupère un événement
/// </summary>
/// <param name="id">L'identifiant de l'événement</param>
/// <returns>L'événement demandé ou NotFound</returns>
[HttpGet("{id:int}")]
public async Task<IActionResult> Show(int id)
{
var evenement = await _evenementService.FindById(id);

if (evenement is null) return NotFound();

return Ok(_mapper.Map<EvenementDto>(evenement));
}
info

Cette fonction appelle une fonction déjà existante au niveau du service afin d'obtenir l'événement et on utilise finalement AutoMapper pour retourner un EvenementDto à partir du modèle Evenement.

Tester via Scalar ou Postman

À l'aide d'un Id d'événement valide, effectuez une requête GET vers api/evenements/{id}:

http://localhost:4200
info

À noter que dans Scalar vous pouvez préciser l'identifiant pour la requête dans la section Variables de la requête.

Vous devriez recevoir le détail d'un événement.

Récupérer l'événement demandé à partir de l'application client

Maintenant que l'API peut retourner un événement au format JSON, il devrait être possible de le récupérer via le l'application client.

Modifier la page Show du projet Admin

On doit premièrement éditer la page Show pour lui ajouter une référence à un objet EvenementDto puisque c'est ce qu'on recevra en provenance de l'API.

On en profitera aussi pour ajouter la coquille de la fonction OnInitializedAsync() qui permettra de faire l'appel au service (API).

  1. Ajouter EvenementDto afin de contenir le retour de l'API
    Snowfall.Web.Admin/Pages/Evenements/Show.razor
    @page "/evenements/{Id:int}"
    @using Snowfall.Application.Dtos.Evenements

    <h3>Show</h3>

    @code {
    [Parameter]
    public int Id { get; set; }
    private EvenementDto? _evenementDto;
    }
  2. Ajouter la fonction OnInitializedAsync
    Snowfall.Web.Admin/Pages/Evenements/Show.razor
    @code {
    [Parameter]
    public int Id { get; set; }

    private EvenementDto? _evenementDto;

    protected override async Task OnInitializedAsync()
    {
    // Récupérer l'événement via le service / l'API
    }
    }

Ajouter une fonction ObtenirEvenement à EvenementHttpClient

Pour que la page Show puisse récupérer l'événement, elle doit appeler le client afin que ce dernier communique avec l'API.

Dans la classe EvenementHttpClient, ajoutez une fonction ObtenirEvenement pour récupérer un événement individuel par son id.

Snowfall.Web.Admin/HttpClients/EvenementHttpClient.cs
//...

public async Task<EvenementDto?> ObtenirEvenement(int id)
{
string url = $"{BaseApiUrl}/{id}";
return await _client.GetFromJsonAsync<EvenementDto>(url);
}

//...

Appeler ObtenirEvenement dans la page Show

Il ne reste qu'à faire l'appel au HttpClient et d'afficher un minimum d'information.

  1. Injectez dans la page le client HTTP
    Snowfall.Web.Admin/Pages/Evenements/Show.razor
    @page "/evenements/{Id:int}"
    @using Snowfall.Application.Dtos.Evenements
    @using Snowfall.Web.Admin.HttpClients

    @inject EvenementHttpClient EvenementHttpClient
  2. Faire l'appel au client pour récupérer l'événement
    Snowfall.Web.Admin/Pages/Evenements/Show.razor
    protected override async Task OnInitializedAsync()
    {
    _evenementDto = await EvenementHttpClient.ObtenirEvenement(Id);
    }
  3. Afficher un minimum d'information
    Snowfall.Web.Admin/Pages/Evenements/Show.razor
    @page "/evenements/{Id:int}"
    @using Snowfall.Application.Dtos.Evenements
    @using Snowfall.Web.Admin.HttpClients

    @inject EvenementHttpClient EvenementHttpClient

    @if (_evenementDto == null)
    {
    <p>Chargement...</p>
    }
    else
    {
    <h1>@_evenementDto.Nom</h1>
    }

    //...

Test

Si vous testez l'application, le titre du jeu devrait être affiché sur la page!

http://localhost:4200