仅从API返回有用的字段

时间:2019-04-23 12:30:01

标签: c# asp.net-core-webapi

如何在.net core webapi中应用JSON过滤作为响应

我有一个端点,该端点正在使用HTTP Get动词并以JSON返回80多个字段,但是我只想根据某些条件返回客户端要求的字段。不知道如何实现相同的功能,以及如何从客户端(邮递员,麻烦者)传递选择器过滤的参数。任何快速的建议或示例解决方案都将有助于实现相同的目标。

[HttpGet]
[Route("api/v1/cards")]
public IActionResult Cards(inputParameters,selector,filtering)
{
return OK(----)
}

选择器客户端中传递他想要响应的字段,在过滤客户端中传递他的条件参数

4 个答案:

答案 0 :(得分:0)

制作一个ViewModel并返回其中。

例如:

public class ViewModel
{
    public string Property1 { get; set; }

    public string Property2 { get; set; }

    public int Property3 { get; set; }
}

然后执行您的GET操作:

[HttpGet]
[Route("api/v1/cards")]
public IActionResult Cards(inputParameters,selector,filtering)
{
    return OK(new ViewModel 
           { 
                Property1 = FromJson.Something, 
                Property2 = FromJson.Something44, 
                Property3 = FromJson.Something79 
           });
}

通过视图模型类,您可以使用自己想要的属性以JSON风格返回。

答案 1 :(得分:0)

您可以使用Automapper库,并通过设置映射配置文件类将模型映射到ViewModel。

首先,添加Automapper dependency injectionDICOM image here软件包。

然后将Automapper添加到启动类:

    public class Startup
{
    // Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        ...
Mapper.Reset(); // Useful if you're using code-first and migrations.
services.AddAutomapper();
    }

    // Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        ...
    }
}

创建您的ViewModel,仅将其所需的属性发送到前端应用程序。

public class CardViewModel
{
public object PropVM1 {get; set;}
public object PropVM2 {get; set;}
public object PropVM3 {get; set;}
...
}

来自Model类:

public class Card
    {
    public object Prop1 {get; set;}
    public object Prop2 {get; set;}
    public object Prop3 {get; set;}
    public object Prop4 {get; set;}
    public object Prop5 {get; set;}
    ...
    }

然后创建一个继承自AutoMapper.Profile的映射配置文件类:

public class AppMappingProfile : Profile
{
public AppMappingProfile()
{
CreateMap<Card, CardViewModel>()
   .ForMember(d => d.PropVM1, ex => ex.MapFrom(o => o.Prop1))
   .ForMember(d => d.PropVM2, ex => ex.MapFrom(o => o.Prop2))
   .ForMember(d => d.PropVM3, ex => ex.MapFrom(o => o.Prop3))
   .ReverseMap() // if a two-away Mapping is necessary
}
} 

最后,将Automapper添加到您的控制器中:

public class CardController : Controller
{
private readonly IMapper;
public CardController(IMapper mapper)
{
_mapper = mapper;
}
[HttpGet]
[Route("api/v1/cards")]
public IActionResult Cards(inputParameters,selector,filtering)
{
var result = DoYourThing();

//if a list of cards
if(result != null && result.Count > 0) return Ok(_mapper.Map<List<Card>, List<CardViewModel>>(result));
return NoContent();

// if single card object
if(result != null) return Ok(_mapper.Map<Card, CardViewModel>())
return NoContent();
}

}

希望您会发现这很有帮助。

答案 2 :(得分:0)

我使用了很棒的 OData 解决了这个问题。 您可以通过链接在.net核心api中实现OData Supercharging your Web APIs with OData and ASP.NET Core

答案 3 :(得分:-1)

您可以返回Dictionary<string, object>并将所需的字段添加为这样的条目

[HttpGet]
[Route("api/v1/cards")]
public IActionResult Cards(inputParameters,selector,filtering)
{
    var result = new Dictionary<string, object>();
    result["variable1"] = "value1";
    if (something == true)
        result["variable2"] = 7;
    return OK(result);
}