REST API Метод Best Practice GET со многими условиями - PullRequest
0 голосов
/ 27 января 2020

У меня есть 2 вопроса:

1. Каков наилучший метод для метода REST API GET, если есть много условий с параметрами.

пример:

У меня есть API клиентов, а пользователь хочет API с параметром запроса, например:

  • idnumber и мобильный телефон

  • name (можно использовать содержит, если пользовательский ввод% ) или мобильный телефон

  • idnumber и idtype или дата рождения

я должен сделать 3 пользовательских API с одинаковым маршрутом для каждого сочетания параметров?

Я искал везде, но не могу найти ответ, в большинстве статей приведены только общие рекомендации, подобные этим:

  • API / клиент - получить всех клиентов

  • API / клиента / {ID} - получить клиента по идентификатору

2.В отношении ответа API

пример:

У меня есть API клиентов, и ответ такой: - CustomerID - CustomerName - IDNumber - MobilePhone - Addr ess

Допустим, у меня есть 2 пользователя, которые используют этот API, но я хочу, чтобы только 1 пользователь мог видеть ответ с "мобильным телефоном" и "адресом", а другой пользователь только с customrid, именем клиента и idnumber, вопрос в том, как я могу сделать API? я должен создать 2 API?

извините за мой плохой английский sh

я погуглил везде, но я не могу найти правильный ответ, пожалуйста, помогите

Ответы [ 4 ]

0 голосов
/ 27 января 2020
  1. всегда создают разные конечные точки для каждого вызова веб-API. если отправленные параметры имеют разные типы для каждого сценария, вы можете перегрузить метод контроллера с тем же именем.

  2. это определенно требует двух разных конечных точек, потому что ответ модель отличается. таким образом, вы не получите много упаковки и распаковки для ответной модели данных.

0 голосов
/ 27 января 2020

Относительно вашего первого вопроса, пожалуйста, постарайтесь сделать вызовы API как можно более четкими. 1. Для приведенного выше примера в идеале следует использовать три разных метода, так как логика проверки c будет отличаться в каждом случае. 2. Кроме того, учитывая масштабируемость и ремонтопригодность, будет реальной задачей обработать простые изменения, не затрагивая другие два.

Для вашего второго запроса вы можете объединить оба вызова в одном методе. Поскольку базовая модель одинакова, сгенерируйте общий ответ c и отфильтруйте результаты соответствующим образом. Или же создайте оболочку для модели, чтобы генерировать индивидуальный ответ для каждого пользователя. Но нет необходимости выставлять два вызова API для этого.

0 голосов
/ 27 января 2020
[![class Program
    {
        static void Main(string\[\] args)
        {
            var customer = new Customer() { CustomerID = 666, CustomerName = "john", IDNumber = "john123", MobilePhone = "9834567899", Address = "Test address 1" };

            //For user 1
            var allewdProperties = new string\[\] { "CustomerName", "IDNumber", "CustomerID" };//For user 1


            var json = JsonConvert.SerializeObject(customer
                            ,
                            new JsonSerializerSettings() { ContractResolver = new CustomContractResolver(allewdProperties.ToList()) }
                        );

            //Data for user1
            Console.WriteLine("Data for user 1");
            Console.WriteLine(json);

            //for user 2
            allewdProperties = new string\[\] { "MobilePhone", "Address" };//For user 2
            json = JsonConvert.SerializeObject(customer,
                new JsonSerializerSettings() { ContractResolver = new CustomContractResolver(allewdProperties.ToList()) }
            );
            Console.WriteLine("Data for user 2");
            Console.WriteLine(json);

            Console.ReadLine();
        }
    }

    public class Customer
    {
        public int CustomerID { set; get; }
        public string CustomerName { set; get; }
        public string IDNumber { set; get; }
        public string MobilePhone { set; get; }
        public string Address { set; get; }
    }

    public class CustomContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
    {
        IEnumerable<string> _allowedProps = null;

        public CustomContractResolver(IEnumerable<string> allowedProps)
        {
            _allowedProps = allowedProps;
        }

        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            return _allowedProps.Select(p => new JsonProperty()
            {
                PropertyName = p,
                PropertyType = type.GetProperty(p).PropertyType,
                Readable = true,
                Writable = true,
                ValueProvider = base.CreateMemberValueProvider(type.GetMember(p).First())
            }).ToList();
        }
    }][1]][1]
0 голосов
/ 27 января 2020

Позвольте мне попытаться ответить на них.

Типичным способом было бы все еще просто создать API, например, API / клиент. От пользователя / приложения, потребляющего API, следует ожидать передачи объекта Customer (не в буквальном смысле OOP). Что-то вроде json объекта

{
 idnumber: "123",
 mobilephone: "",
 DOB: null
}

Как-то так: https://weblog.west-wind.com/posts/2013/dec/13/accepting-raw-request-body-content-with-aspnet-web-api

При обработке этого объекта вы, вероятно, можете проверить тип пользователя в коде. Это суперпользователь или обычный пользователь (просто пример). На основании этого вы можете вернуть соответствующий ответ.

Надеюсь, я правильно понял ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...