如何在一个GET中返回两个API?

时间:2019-01-07 01:48:23

标签: c# asp.net asp.net-web-api

首先,我想说我是编程新手。我正在使用ASP.net并尝试为个人项目创建API,并使用JSON作为结果。

我可以制作两个看起来像这样的页面(为便于阅读而进行了编辑。)

{
    "user": 
        {"owner_id":1, "name":"Joe", "country":"USA"}, 
        {"owner_id":2, "name":"Bob", "country":"Canada"}
} 

{
    "pet": 
        {"id":1, owner_id:"1", "animal":"dog", "name":"Spot"}, 
        {"id":2, owner_id:"2", "animal":"cat", "name":"Snowball"}, 
        {"id":3, owner_id:"2", "animal":"fish", "name":"Bubble"} 
}

我想要的是将这两个结合成一个看起来像这样的“所有者” API页面:

[
    {
        "user": 
        [
            "owner_id":1, "name":"Joe", "country":"USA"
        ], 
        "pet":
        [
            "id":1, owner_id:"1", "animal":"dog", "name": "Spot"
        ]
    }, 

    {
        "user":
        [
            "owner_id":2, "name": "Bob", "country": "Canada"
        ], 
        "pet": 
        [
            "id":2, owner_id:"2", "animal":"cat", "name":"Snowball"
        ], 
        [
            "id":3, owner_id:"2", "animal":"fish", "name":"Bubble"
        ]
    }
]

我已经在Google上搜索并检查了很多,很多解释已经浮现在我头上。我尝试了很多,甚至看起来最好的也没用。

这是我尝试的无效示例。

using System.Collections.Generic;

namespace TestAPI.Models

public class user
{
    public int id { get; set; }
    public string name { get; set; }
    public string country { get; set; }
}

public class pet
{
    public int id { get; set; }
    public string animal { get; set; }
    public string name { get; set; }
    public int owner_id { get; set; } 
}

public class owner
{
    public int Id { get; set; }
    public List<user> user{ get; set; }
    public List<pet> pet{ get; set; }
}

下面是一个例子,我尝试此操作时遇到了许多不同的错误结果。

[{"Id":1,"user":null,"pet":null},
{"Id":2,"user":null,"pet":null}]

任何帮助以及任何潜在客户都将不胜感激。这是我第一次使用任何这些东西,所以我一团糟,但我一直在阅读许多教程以尝试将其降低。

2 个答案:

答案 0 :(得分:2)

查看上面的JSON,如果确实是您想要的输出,则需要更改模型。您似乎要搜索用户并返回所有者和宠物。因此,我将像这样更改您的关系,并在用户上增加所有者和宠物属性,以反映出这是一个列表。

public class Owner {
    public int Id {get;set;}
    public string Name {get;set;}
    public string Country {get;set}
}

public class Pet {
    public int Id { get; set; }
    public string Animal { get; set; }
    public string Name { get; set; }
    public int OwnerId { get; set; } 
}

public class User {
    public int Id {get;set;}
    public List<Owner> Owners {get;set;}
    public List<Pet> Pets {get;set}
}

现在,当您从API调用返回用户对象时,我假设这就是您正在做的事情,您应该会得到期望的结果。

根据空列表更新。我会向用户添加一个构造函数,并将您的Pets和Owners设置为一个空列表。

public class User {
    public int Id {get;set;}
    public List<Owner> Owners {get;set;}
    public List<Pet> Pets {get;set;}

    public User() {
        Owners = new List<Owner>():
        Pets = new List<Pet>():
    }
}

答案 1 :(得分:0)

创建一个调用pet和用户api的包装器api,并将结果合并并返回。这样您将需要进行1 get调用才能合并两个数据集。 在调用包装器api之后,它将同时调用这两个api,然后您可以遍历用户集合并将每个pet添加到新的合并模型(Ex UserWithPet)中,并且如建议的那样,您可以使用Newtonsoft轻松地转换为Json。 上面的用户类似乎是一个好方法。