简体   繁体   English

将 web API 消费成 Blazor

[英]Consuming web API into Blazor

I'm trying to consume a web API into Blazor but am struggling to extract certain information from the API我正在尝试将 web API 消耗到 Blazor 中,但我正在努力从 API 中提取某些信息

using System.Text.Json;

namespace CA3.Song
{
    public class SongService : ISongService
    {
        private readonly HttpClient _httpClient;
        const string _baseUrl = "https://genius-song-lyrics1.p.rapidapi.com/";
        const string _songEndpoint = "songs/chart?time_period=day&chart_genre=all&per_page=10&page=1";
        const string _host = "genius-song-lyrics1.p.rapidapi.com";
        const string _key = "{key}";

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

        public async Task<List<SongItem>> GetSong()
        {
            Configure();

            var response = await _httpClient.GetAsync(_songEndpoint);
            var response_outcome = response.EnsureSuccessStatusCode;

            using var stream = await response.Content.ReadAsStreamAsync();

            var dto = await JsonSerializer.DeserializeAsync<SongDto>(stream);
            return dto.response.chart_items.Select(n => new SongItem { Artist = n.item.primary_artist, Title = n.item.primary_title, ReleaseDate = n.primary_release_date }).ToList().T ;
        }

        private void Configure()
        {
            _httpClient.BaseAddress = new Uri(_baseUrl);
            _httpClient.DefaultRequestHeaders.Add("X-RapidAPI-Host", _host);
            _httpClient.DefaultRequestHeaders.Add("X-Rapid-Key", _key);
        }
    }
}

The issue is on the return statement using LINQ.问题出在使用 LINQ 的返回语句上。

namespace CA3.Song
{
    public class SongDto
    {
        public Meta meta { get; set; }
        public Response response { get; set; }
    }

    public class Meta
    {
        public int status { get; set; }
    }

    public class Response
    {
        public Chart_Items[] chart_items { get; set; }
        public int next_page { get; set; }
    }

    public class Chart_Items
    {
        public string _type { get; set; }
        public string type { get; set; }
        public Item item { get; set; }
    }

    public class Item
    {
        public string _type { get; set; }
        public int annotation_count { get; set; }
        public string api_path { get; set; }
        public string artist_names { get; set; }
        public string full_title { get; set; }
        public string header_image_thumbnail_url { get; set; }
        public string header_image_url { get; set; }
        public int id { get; set; }
        public bool instrumental { get; set; }
        public int lyrics_owner_id { get; set; }
        public string lyrics_state { get; set; }
        public int lyrics_updated_at { get; set; }
        public string path { get; set; }
        public int pyongs_count { get; set; }
        public string relationships_index_url { get; set; }
        public Release_Date_Components release_date_components { get; set; }
        public string release_date_for_display { get; set; }
        public string song_art_image_thumbnail_url { get; set; }
        public string song_art_image_url { get; set; }
        public Stats stats { get; set; }
        public string title { get; set; }
        public string title_with_featured { get; set; }
        public int updated_by_human_at { get; set; }
        public string url { get; set; }
        public Featured_Artists[] featured_artists { get; set; }
        public Primary_Artist primary_artist { get; set; }
    }

    public class Release_Date_Components
    {
        public int year { get; set; }
        public int month { get; set; }
        public int day { get; set; }
    }

    public class Stats
    {
        public int unreviewed_annotations { get; set; }
        public int concurrents { get; set; }
        public bool hot { get; set; }
        public int pageviews { get; set; }
    }

    public class Primary_Artist
    {
        public string _type { get; set; }
        public string api_path { get; set; }
        public string header_image_url { get; set; }
        public int id { get; set; }
        public string image_url { get; set; }
        public string index_character { get; set; }
        public bool is_meme_verified { get; set; }
        public bool is_verified { get; set; }
        public string name { get; set; }
        public string slug { get; set; }
        public string url { get; set; }
        public int iq { get; set; }
    }

    public class Featured_Artists
    {
        public string _type { get; set; }
        public string api_path { get; set; }
        public string header_image_url { get; set; }
        public int id { get; set; }
        public string image_url { get; set; }
        public string index_character { get; set; }
        public bool is_meme_verified { get; set; }
        public bool is_verified { get; set; }
        public string name { get; set; }
        public string slug { get; set; }
        public string url { get; set; }
        public int iq { get; set; }
    }

}

Above is the JSON file and I'm trying to extract the artist name, song title and release date from Item but it isn't in a list so I'm trying to find a way to extract this info using LINQ. Any help would be greatly appreciated !以上是 JSON 文件,我正在尝试从 Item 中提取艺术家姓名、歌曲名称和发布日期,但它不在列表中,所以我正在尝试使用 LINQ 找到一种提取此信息的方法。任何帮助都会不胜感激!

I think you misinterpreted the declaration of the JSON. They are stored in an array Chart_Items[] chart_items thus you may use linq.我认为您误解了 JSON 的声明。它们存储在数组Chart_Items[] chart_items ,因此您可以使用 linq。

There are many ways to do this, I took advantage of named tuples in modern C# paired with linq.有很多方法可以做到这一点,我利用现代 C# 中的命名元组与 linq 配对。

Response r = new Response();//some resonse from api
var results = r.chart_items.Select(i => (i.item.artist_names, i.item.title, i.item.release_date_components)).ToList();

foreach(var result in results)
{
    string artist_names = result.artist_names;
    string title = result.title;
    Release_Date_Components release_date_components = result.release_date_components;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM