如何在.net core webapi中应用JSON过滤作为响应
我有一个端点,该端点正在使用HTTP Get动词并以JSON返回80多个字段,但是我只想根据某些条件返回客户端要求的字段。不知道如何实现相同的功能,以及如何从客户端(邮递员,麻烦者)传递选择器和过滤的参数。任何快速的建议或示例解决方案都将有助于实现相同的目标。
[HttpGet]
[Route("api/v1/cards")]
public IActionResult Cards(inputParameters,selector,filtering)
{
return OK(----)
}
在选择器客户端中传递他想要响应的字段,在过滤客户端中传递他的条件参数
答案 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 injection和DICOM 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);
}