web-dev-qa-db-fra.com

Comment utiliser http.getjsonasync () dans l'application Blazor Server?

Comme je suis en train d'évaluer la blazor (serveur), j'ai créé une simple application POC dans VS2019 (version 16.3.8) pour commander des pizzas. J'ai créé une application de serveur Blazor qui obtient ses données à partir d'un projet Web API Core 3.0, rien de fence, d'obtenir des données au démarrage dans la page Index Razor est implémentée comme suit:

enter image description here

Et le service qui masque l'appel d'API externe est mis en œuvre comme suit:

enter image description here

Donc, j'utilise la méthode habituelle getstringasync () sur l'instance de client HTTP créée qui renvoie les données demandées sous forme de chaîne JSON qui est enfin désérialisée au type d'objet requis. Mais malheureusement, je ne peux pas utiliser la méthode getjsonasync () ici, comme indiqué dans les échantillons GITUB qui peuvent être trouvés ici:

https://github.com/software-architects/learn-blazor/tree/master/samples/restapi

enter image description here

Après avoir cherché un moment, je suis passé à travers le site suivant:

https://learn-blazor.com/architecture/rest-api

ce qui m'a expliqué que je devais utiliser le "httpclientjsonextensions", comme mentionné dans le prochain fragment du site:

enter image description here

Ainsi, après avoir téléchargé les échantillons et examiner rapidement le projet "RestaSi.client" (qui contient l'application hébergée Webassembly), je vois les prochaines dépendances référencées:

enter image description here

Qui a (apparemment) la méthode d'extension sur la classe "HTTP" pour l'utilisation de getjsonasync () à partir de l'application client.

Donc, ma question est de cesse évidente, comment puis-je avoir le même comportement dans mon application Blazor Server, car il n'y a pas de dépendances Microsoft.aspnetcore.Blazor dans l'application BLAZOR Server, comme vous pouvez le constater:

enter image description here

Et parce que mon pizzamenuservice vit dans le dossier "Services" de mon application de serveur Blazor et fait appel à l'API de repos (comme indiqué au début de ma demande), il n'a pas la méthode d'extension d'exécution getjsonasync () ... Comment peut-il être atteint alors sur une application basée sur le serveur blazor?

Thx pour toute réponse! ????

Emmanuel Nuyttens.

4
Emmanuel Nuyttens

La méthode GetJsonAsync() est une méthode d'extension pour httpclient, mais il ressemble à ce que vous essayez vraiment de réaliser ici est un niveau d'abstractionbn supérieur - c'est-à-dire une désérialisation à un tableau de Customers. RestClient.net peut le faire dans Blazor sans l'étape supplémentaire.

Voici un appel similaire dans une page Blazor:

private List<RestCountry> countries;

protected override async Task OnInitializedAsync()
{
    countries = await new Client(new NewtonsoftSerializationAdapter(), baseUri: new Uri("https://restcountries.eu/rest/v2/")).GetAsync<List<RestCountry>>();
}

Référence de code

Ce code fonctionne à la fois sur le côté du serveur et le rendu côté client et évite la nécessité d'appeler getjsonasync. Cet article explique comment obtenir l'échantillon de travail.

1
Christian Findlay

C'est ainsi que cela peut fonctionner dans le blazor côté serveur:

Ajouter une référence à Microsoft.AspNetCore.Blazor.HttpClient emballer

 <PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.0.0-preview9.19465.2" PrivateAssets="all" />

Dans startup.cs, ajoutez httpClient à di conteneur:

public void ConfigureServices(IServiceCollection services)
{
 ...
    if (!services.Any(x => x.ServiceType == typeof(HttpClient)))
    {
        services.AddSingleton<HttpClient>();
    }
  ...
}

Dans votre classe "Service", injecter HttpClient via constructeur:

public PizaaMenuService(HttpClient httpClient)
{
    _httpClient = httpClient;
}

Ensuite, vous devriez pouvoir utiliser le HTTP et la désérialisation comme celui-ci:

public async Task<Menu> GetPizzaMenuAsync()
        {
            string sUrl = _ApiUrlBase + "api/pizzamenu";
            return await _httpClient.GetJsonAsync<Menu>(sUrl);
        }

REMARQUE : Lorsque vous exécutez déjà l'application sur le serveur, si votre API est située sur le même serveur qui sert l'application, vous n'avez éventuellement pas besoin d'appeler l'API via httpclient; Au lieu de cela, vous pouvez directement instancier vos objets métier (la même chose que vous faites maintenant dans votre contrôleur API).

0
rk72