Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多次调用Api C#_C#_Asp.net Core_Asp.net Web Api_.net Core - Fatal编程技术网

多次调用Api C#

多次调用Api C#,c#,asp.net-core,asp.net-web-api,.net-core,C#,Asp.net Core,Asp.net Web Api,.net Core,我试图使用rawgapi并从它们的api中获取游戏,我创建了游戏实体类来解析数据 //game entity public class Game { public int Id { get; set; } public string Slug { get; set; } public string Name { get; set; } public string Released { get; set; }

我试图使用rawgapi并从它们的api中获取游戏,我创建了游戏实体类来解析数据

//game entity
public class Game
    {
        public int Id { get; set; }
        public string Slug { get; set; }
        public string Name { get; set; }
        public string Released { get; set; }
        public string Background_Image { get; set; }
        public int Rating { get; set; }
        public int Playtime { get; set; }
    }
现在我需要从api中获取游戏,我创建了这个方法

public static async Task<List<Game>> ApiRawgGamesRequest()
        {
            var gamesList = new List<Game>();

            for (int i = 1; i < 250; i++)
            {
                using (var msg = new HttpRequestMessage(HttpMethod.Get, new Uri($"https://api.rawg.io/api/games?page_size=40&page={i}")))
                using (var response = await _client.SendAsync(msg))
                {
                    response.EnsureSuccessStatusCode();
                    var gamesResponse = await response.Content.ReadAsAsync<Game[]>();
                    gamesList.AddRange(gamesResponse);
                }
            }

            return gamesList;
        }

有更好的方法吗?

您的异常是由错误的JSON解析对象造成的。
在您要调用的代码中:

var gamesResponse = await response.Content.ReadAsAsync<Game[]>();

您的异常是由错误的JSON解析对象造成的。
在您要调用的代码中:

var gamesResponse = await response.Content.ReadAsAsync<Game[]>();

因此,如果您试图仅反序列化json的“结果”部分,则必须使用响应json中的所有项构建一个类

// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
    public class Result    {
        public int id { get; set; } 
        public string slug { get; set; } 
        public string name { get; set; } 
        public string released { get; set; } 
        public bool tba { get; set; } 
        public string background_image { get; set; } 
        public double rating { get; set; } 
    }

    public class Root    {
        public int count { get; set; } 
        public string next { get; set; } 
        public object previous { get; set; } 
        public List<Result> results { get; set; } 
    }
//根myDeserializedClass=JsonConvert.DeserializeObject(myJsonResponse);
公开课成绩{
公共int id{get;set;}
公共字符串slug{get;set;}
公共字符串名称{get;set;}
释放的公共字符串{get;set;}
公共bool tba{get;set;}
公共字符串背景_图像{get;set;}
公共双重评级{get;set;}
}
公共类根{
公共整数计数{get;set;}
公共字符串next{get;set;}
前一个公共对象{get;set;}
公共列表结果{get;set;}
}

您总是可以在线使用某种类型的Json>类生成器,用于此anwser:

因此,如果您试图仅反序列化Json的“结果”部分,则必须使用响应Json中的所有项构建一个类

// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
    public class Result    {
        public int id { get; set; } 
        public string slug { get; set; } 
        public string name { get; set; } 
        public string released { get; set; } 
        public bool tba { get; set; } 
        public string background_image { get; set; } 
        public double rating { get; set; } 
    }

    public class Root    {
        public int count { get; set; } 
        public string next { get; set; } 
        public object previous { get; set; } 
        public List<Result> results { get; set; } 
    }
//根myDeserializedClass=JsonConvert.DeserializeObject(myJsonResponse);
公开课成绩{
公共int id{get;set;}
公共字符串slug{get;set;}
公共字符串名称{get;set;}
释放的公共字符串{get;set;}
公共bool tba{get;set;}
公共字符串背景_图像{get;set;}
公共双重评级{get;set;}
}
公共类根{
公共整数计数{get;set;}
公共字符串next{get;set;}
前一个公共对象{get;set;}
公共列表结果{get;set;}
}

您总是可以在线使用某种类型的Json>类生成器,用于此anwser:

有几个很好的答案可以解决结构不正确的问题。为了更好地控制变量名,我在这里添加了注释,这是一个很好的实践。注意,DataContract和DataMember是框架的一部分,但可以很好地与Json.Net配合使用,即使Json.Net附带了它们自己的注释集

    [DataContract]
    public class Payload
    {
        [DataMember(Name = "count")]
        public int Count { get; set; }

        [DataMember(Name = "next")]
        public string Next { get; set; }

        [DataMember(Name = "previous")]
        public string Previous { get; set; }

        [DataMember(Name = "results")]
        public List<GameData> Results { get; set; }
    }

    [DataContract]
    public class GameData
    {
        [DataMember(Name = "id")]
        public long Id { get; set; }

        [DataMember(Name = "slug")]
        public string Slug { get; set; }

        [DataMember(Name = "name")]
        public string Name { get; set; }

        [DataMember(Name = "rating")]
        public float Rating { get; set; }

        [DataMember(Name = "rating_top")]
        public float Rating_top { get; set; }
    }

    public static async Task<IEnumerable<Payload>> GetGameDatasAsync(int page = 1, int pageSize = 40, bool followNext = false, CancellationToken cancellationToken = default)
    {
        cancellationToken.ThrowIfCancellationRequested();

        string next = $"https://api.rawg.io/api/games?page_size={pageSize}&page={page}";
        var results = new List<Payload>();

        using (var client = new HttpClient())
            do
            {
                var result = await client.GetAsync(next, cancellationToken);

                next = string.Empty;

                if (result.IsSuccessStatusCode)
                {
                    var json = await result.Content.ReadAsStringAsync();

                    if (!string.IsNullOrWhiteSpace(json))
                    {
                        var payload = JsonConvert.DeserializeObject<Payload>(json);

                        next = payload.Next;

                        results.Add(payload);
                    }
                }

            } while (!string.IsNullOrWhiteSpace(next) && followNext);

        return results;
    }
[DataContract]
公共类有效载荷
{
[DataMember(Name=“count”)]
公共整数计数{get;set;}
[DataMember(Name=“next”)]
公共字符串Next{get;set;}
[DataMember(Name=“previous”)]
前一个公共字符串{get;set;}
[DataMember(Name=“results”)]
公共列表结果{get;set;}
}
[数据合同]
公共类游戏数据
{
[数据成员(Name=“id”)]
公共长Id{get;set;}
[DataMember(Name=“slug”)]
公共字符串Slug{get;set;}
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[数据成员(Name=“评级”)]
公共浮动评级{get;set;}
[DataMember(Name=“rating_top”)]
公共浮动评级_top{get;set;}
}
公共静态异步任务GetGameDatasAsync(int page=1,int pageSize=40,bool followNext=false,CancellationToken CancellationToken=default)
{
cancellationToken.ThrowIfCancellationRequested();
字符串next=$”https://api.rawg.io/api/games?page_size={pageSize}&page={page}”;
var results=新列表();
使用(var client=new HttpClient())
做
{
var result=await client.GetAsync(下一步,cancellationToken);
next=string.Empty;
if(结果。IsSuccessStatusCode)
{
var json=await result.Content.ReadAsStringAsync();
如果(!string.IsNullOrWhiteSpace(json))
{
var payload=JsonConvert.DeserializeObject(json);
下一个=有效载荷。下一个;
结果。添加(有效载荷);
}
}
}while(!string.IsNullOrWhiteSpace(next)&&followNext);
返回结果;
}

对于结构不正确的问题,有几个很好的答案。为了更好地控制变量名,我在这里添加了注释,这是一个很好的实践。注意,DataContract和DataMember是框架的一部分,但可以很好地与Json.Net配合使用,即使Json.Net附带了它们自己的注释集

    [DataContract]
    public class Payload
    {
        [DataMember(Name = "count")]
        public int Count { get; set; }

        [DataMember(Name = "next")]
        public string Next { get; set; }

        [DataMember(Name = "previous")]
        public string Previous { get; set; }

        [DataMember(Name = "results")]
        public List<GameData> Results { get; set; }
    }

    [DataContract]
    public class GameData
    {
        [DataMember(Name = "id")]
        public long Id { get; set; }

        [DataMember(Name = "slug")]
        public string Slug { get; set; }

        [DataMember(Name = "name")]
        public string Name { get; set; }

        [DataMember(Name = "rating")]
        public float Rating { get; set; }

        [DataMember(Name = "rating_top")]
        public float Rating_top { get; set; }
    }

    public static async Task<IEnumerable<Payload>> GetGameDatasAsync(int page = 1, int pageSize = 40, bool followNext = false, CancellationToken cancellationToken = default)
    {
        cancellationToken.ThrowIfCancellationRequested();

        string next = $"https://api.rawg.io/api/games?page_size={pageSize}&page={page}";
        var results = new List<Payload>();

        using (var client = new HttpClient())
            do
            {
                var result = await client.GetAsync(next, cancellationToken);

                next = string.Empty;

                if (result.IsSuccessStatusCode)
                {
                    var json = await result.Content.ReadAsStringAsync();

                    if (!string.IsNullOrWhiteSpace(json))
                    {
                        var payload = JsonConvert.DeserializeObject<Payload>(json);

                        next = payload.Next;

                        results.Add(payload);
                    }
                }

            } while (!string.IsNullOrWhiteSpace(next) && followNext);

        return results;
    }
[DataContract]
公共类有效载荷
{
[DataMember(Name=“count”)]
公共整数计数{get;set;}
[DataMember(Name=“next”)]
公共字符串Next{get;set;}
[DataMember(Name=“previous”)]
前一个公共字符串{get;set;}
[DataMember(Name=“results”)]
公共列表结果{get;set;}
}
[数据合同]
公共类游戏数据
{
[数据成员(Name=“id”)]
公共长Id{get;set;}
[DataMember(Name=“slug”)]
公共字符串Slug{get;set;}
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[数据成员(Name=“评级”)]
公共浮动评级{get;set;}
[DataMember(Name=“rating_top”)]
公共浮动评级_top{get;set;}
}
公共静态异步任务GetGameDatasAsync(int page=1,int pageSize=40,bool followNext=false,CancellationToken CancellationToken=default)
{
cancellationToken.ThrowIfCancellationRequested();
字符串next=$”https://api.rawg.io/api/games?page_size={pageSize}&page={page}”;
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
    public class Result    {
        public int id { get; set; } 
        public string slug { get; set; } 
        public string name { get; set; } 
        public string released { get; set; } 
        public bool tba { get; set; } 
        public string background_image { get; set; } 
        public double rating { get; set; } 
    }

    public class Root    {
        public int count { get; set; } 
        public string next { get; set; } 
        public object previous { get; set; } 
        public List<Result> results { get; set; } 
    }
    [DataContract]
    public class Payload
    {
        [DataMember(Name = "count")]
        public int Count { get; set; }

        [DataMember(Name = "next")]
        public string Next { get; set; }

        [DataMember(Name = "previous")]
        public string Previous { get; set; }

        [DataMember(Name = "results")]
        public List<GameData> Results { get; set; }
    }

    [DataContract]
    public class GameData
    {
        [DataMember(Name = "id")]
        public long Id { get; set; }

        [DataMember(Name = "slug")]
        public string Slug { get; set; }

        [DataMember(Name = "name")]
        public string Name { get; set; }

        [DataMember(Name = "rating")]
        public float Rating { get; set; }

        [DataMember(Name = "rating_top")]
        public float Rating_top { get; set; }
    }

    public static async Task<IEnumerable<Payload>> GetGameDatasAsync(int page = 1, int pageSize = 40, bool followNext = false, CancellationToken cancellationToken = default)
    {
        cancellationToken.ThrowIfCancellationRequested();

        string next = $"https://api.rawg.io/api/games?page_size={pageSize}&page={page}";
        var results = new List<Payload>();

        using (var client = new HttpClient())
            do
            {
                var result = await client.GetAsync(next, cancellationToken);

                next = string.Empty;

                if (result.IsSuccessStatusCode)
                {
                    var json = await result.Content.ReadAsStringAsync();

                    if (!string.IsNullOrWhiteSpace(json))
                    {
                        var payload = JsonConvert.DeserializeObject<Payload>(json);

                        next = payload.Next;

                        results.Add(payload);
                    }
                }

            } while (!string.IsNullOrWhiteSpace(next) && followNext);

        return results;
    }