Api Call mit Asp.net Blazor Server Side am Bsp. von https://api.sunrise-sunset.org

    • C# (ASP)
    • (Core) Blazor Server

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von shad.

      Api Call mit Asp.net Blazor Server Side am Bsp. von https://api.sunrise-sunset.org

      Hi,

      ich hab augrund von @shad Anregung mich nochmal mit dem Thema IHttpClientFactory in VS ASp.Net beschäftigt.

      Als Beispiel hab ich hier eine Api Abfrage an api.sunrise-sunset.org realisiert (mit Asp,net Blazor Server-Side).

      Zum Nachbauen:

      -Blazer ServerSide Projekt in VS erstellen
      -NugetPacket Newtonsoft.Json hinzufügen (rechte Maus auf Projektnamen im SolutionExplorer -> Mangage Nugetpackages ->Search ->add)
      -In der Startup.cs einfügen:

      C#-Quellcode

      1. public void ConfigureServices(IServiceCollection services)
      2. {
      3. services.AddRazorPages();
      4. services.AddServerSideBlazor();
      5. services.AddSingleton<WeatherForecastService>();
      6. services.AddSingleton<ApiResponseService>();
      7. //hinzufügen
      8. services.AddHttpClient();
      9. }​

      -Neuen Ordner Models adden
      -In _imports.razor hinzufügen:

      Quellcode

      1. ​@using Newtonsoft.Json @using DEINPROJEKTNAME.Models

      -Den Inahlt von index.razor mit diesem ersetzen:

      C#-Quellcode

      1. ​@page "/"
      2. @inject IHttpClientFactory httpClientFactory;
      3. @if (myJsonResponseAsString != null)
      4. {
      5. <div>
      6. ResponseMsg Status:@httpResponseMessage.StatusCode
      7. <br />
      8. <br />
      9. Response Content: @httpResponseMessage.Content.ToString()
      10. <br />
      11. <br />
      12. Response Headers:@httpResponseMessage.Headers
      13. <br />
      14. <br />
      15. ApiResponse als String:@myJsonResponseAsString
      16. <br />
      17. <br />
      18. Status sunSetApiResponse: @sunSeResponseObj.Status
      19. <br />
      20. <br />
      21. Sonnenuntergang um: @sunSeResponseObj.Results.Sunset
      22. </div>
      23. }
      24. @code{
      25. HttpRequestMessage httpRequestMessage = new HttpRequestMessage();
      26. HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
      27. string myJsonResponseAsString;
      28. SunSetApiModel sunSeResponseObj = new SunSetApiModel();
      29. protected override async Task OnInitializedAsync()
      30. {
      31. httpRequestMessage.Method = new HttpMethod("GET");
      32. httpRequestMessage.RequestUri = new Uri(@"https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400&date=today");
      33. httpRequestMessage.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
      34. var client = httpClientFactory.CreateClient();
      35. httpResponseMessage = await client.SendAsync(httpRequestMessage);
      36. myJsonResponseAsString = await httpResponseMessage.Content.ReadAsStringAsync();
      37. sunSeResponseObj = JsonConvert.DeserializeObject<SunSetApiModel>(myJsonResponseAsString);
      38. }
      39. }

      -Neue Klasse in Ordner Models erstellen SunSetApiModel.cs Inahlt:

      C#-Quellcode

      1. ​using Newtonsoft.Json;
      2. using System;
      3. using System.Collections.Generic;
      4. using System.Linq;
      5. using System.Threading.Tasks;
      6. namespace DEINPROJEKTNAME.Models
      7. {
      8. // SunSetApiModel sunSeResponseObj = JsonConvert.DeserializeObject<SunSetApiModel>(myJsonResponse);
      9. public class Results
      10. {
      11. [JsonProperty("sunrise")]
      12. public string Sunrise { get; set; }
      13. [JsonProperty("sunset")]
      14. public string Sunset { get; set; }
      15. [JsonProperty("solar_noon")]
      16. public string SolarNoon { get; set; }
      17. [JsonProperty("day_length")]
      18. public string DayLength { get; set; }
      19. [JsonProperty("civil_twilight_begin")]
      20. public string CivilTwilightBegin { get; set; }
      21. [JsonProperty("civil_twilight_end")]
      22. public string CivilTwilightEnd { get; set; }
      23. [JsonProperty("nautical_twilight_begin")]
      24. public string NauticalTwilightBegin { get; set; }
      25. [JsonProperty("nautical_twilight_end")]
      26. public string NauticalTwilightEnd { get; set; }
      27. [JsonProperty("astronomical_twilight_begin")]
      28. public string AstronomicalTwilightBegin { get; set; }
      29. [JsonProperty("astronomical_twilight_end")]
      30. public string AstronomicalTwilightEnd { get; set; }
      31. }
      32. public class SunSetApiModel
      33. {
      34. [JsonProperty("results")]
      35. public Results Results { get; set; }
      36. [JsonProperty("status")]
      37. public string Status { get; set; }
      38. }
      39. }


      Wie kommt zu diesen C# Klassen -> Online Converter
      1. Link in Browser eingeben: api.sunrise-sunset.org/json?la…lng=-4.4203400&date=today
      2. den Text komplett kopieren und in json2csharp.com eingeben (Add JsonProperty Yes und use PascalCase Yes)
      3. nun hat man die Api Antwort als C# Class Model :)

      Das müsste es ungefähr sein. Viel Spaß mit dem Beispiel an den der sich die Zeit nimmt das auszuprobieren!

      @shad aus diesem Thread: Kann ein Asp.Net Server Projekt automatisch ohne das ein Benutzer die Webseite besucht in regelmäßigem Abstand einen ApiCall ausführen und die Daten in einem File speichern?
      ​Der HttpClient sollte in ASP.NET Core am Besten anders verwendet werden. Microsoft hat hierzu auch einen Artikel:docs.microsoft.com/en-us/aspne…uests?view=aspnetcore-3.1


      Meine Frage ist:
      Ist das mit dem HttpClient jetzt so wie man es machen soll oder hab ich immer noch Probleme mit zu vielen Sockets offen etc. (was auch immer das heißen mag :))
      codewars.com Rank: 4 kyu
      Hi, das Beispiel sieht gut aus! Wenn du es weiterhin so benutzt, gibt es keine Einwände. :)


      Noch als weiterführenden Kommentar, der aber nichts mit dem eigentlichen Thema zu tun hat (wie gesagt, nutze den HttpClient weiterhin genau so, wie du es im Beispiel demonstriert hast): Solltest du irgendwann einmal nicht mehr Blazor Server, sondern Blazor WASM nutzen sieht die Sache in den .razor Dateien (nicht in Service-Internen Klassen wie z.B. BackgroundServices oder Controllern) nochmal anders aus. Hier gibt es auch einen Artikel zu: docs.microsoft.com/en-us/aspne…b-api?view=aspnetcore-3.1
      Im obersten Kasten direkt am Anfang des Artikels steht auch nochmal, dass du den HTTP Client bei Blazor Server eben doch über die IHttpClientFactory erstellen solltest - somit ist dein Beispiel auch von offizieller Seite bestätigt:

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „shad“ ()