Возврат только полезных полей из API - PullRequest
0 голосов
/ 23 апреля 2019

Как применить фильтрацию JSON в ответе в .net core webapi

У меня есть конечная точка, которая использует глагол HTTP Get и возвращает более 80 полей в JSON, но я хочу только вернуть те поля, которые запрашиваютсяклиентом на основании некоторых условий.Не понимаю, как реализовать то же самое и как передать параметры для селектора и фильтрации от клиента (почтальон, чванство).Любое быстрое предложение или пример решения будет полезно для реализации того же.

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

В селектор клиент, передавая поля, которые он хочет в ответе, и в фильтрация клиентпередавая параметр для условия где

Ответы [ 4 ]

0 голосов
/ 26 апреля 2019

Я решаю проблему, используя OData , это круто. Вы можете перейти по ссылке для реализации OData в вашем .net ядро ​​API Усовершенствование ваших веб-API с помощью OData и ASP.NET Core

0 голосов
/ 23 апреля 2019

Сделайте 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 с необходимыми значениями.

0 голосов
/ 23 апреля 2019

Вы можете использовать библиотеку Automapper и отобразить модель на ViewModel, установив класс профиля сопоставления.

Сначала добавьте Automapper и Внедрение зависимостей Automapper пакеты.

Затем добавьте 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)
    {
        ...
    }
}

Создайте свою модель представления с только необходимыми свойствами для отправки во внешнее приложение.

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();
}

}

Надеюсь, вы найдете это полезным.

0 голосов
/ 23 апреля 2019

Вы можете вернуть 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...