Использовать Patch API с разными членами запроса или Put API? - PullRequest
0 голосов
/ 26 апреля 2020

В веб-приложении мы обновляем информацию о клиентах в API. Данные отправляются в объектах.

Иногда это просто город, иногда электронная почта, иногда комбинация обоих. См. Различные примеры ниже,

Разработчик серверной части C# сказал, что только что отправил объект запроса всем 20 элементам членов, если вы хотите изменить один элемент, просто отправьте те же 19 элементов класса с 1 элементом это не так.

(1) Так что мне нужно было бы отправить повторяющийся блоб (PUT) той же информации о клиенте, просто чтобы изменить 1 атрибут класса? Это правильный способ провести это?

(2) Или это хорошая практика Restful для реализации API-интерфейсов Patch, где члены класса могут все время отличаться?

Одна из проблем заключается в том, что разработчику необходимо создать еще один новый API-интерфейс PATCH, в котором бизнес logi c уже сложен (в дополнение к созданному PUT API).

Данные

public class CustomerMember
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string StreetName{ get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
    public string PhoneNumber { get; set; }
    public string EmailAddress{ get; set; }
    ....
}

Возможные запросы:

{
 "FirstName": "Joe",
 "City": "Atlanta"
}

{
 "email": "joe@hotmail.com",
}

{
 "PhoneNumber": "555-555-5555",
 "ZipCode": "30318"
 "Email": "joe@hotmail.com"
}

1 Ответ

1 голос
/ 26 апреля 2020

Вы можете использовать такой метод в своем репозитории CustomerMember:

public virtual void UpdatePartially(TEntity entity, IEnumerable<string> updatedProperties)
    {
        var keyNames = DbContext.Model
            .FindEntityType(typeof(TEntity))
            .FindPrimaryKey().Properties
            .Select(x => x.Name)
            .ToArray();

        foreach (var item in updatedProperties)
        {
            if (!keyNames.Contains(item))
            {
                DbContext.Entry(entity).Property(item).IsModified = true;
            }
        }
        DbContext.SaveChanges();
    }

Обратите внимание, что здесь вы можете получить обновленные свойства, такие как:

var updatedProperties = typeof(CustomerMember).GetProperties()
            .Select(x => new
            {
                Property = x.Name,
                Value = x.GetValue(customerMemberInstance)
            })
            .Where(x => x.Value != default)
            .Select(_ => _.Property)
            .ToList();

Где customerMemberInstance - это Тело действия, и, наконец, вы правы, когда вы хотите очистить свойство, вы можете отправить его как пустую строку и после получения обновлений свойств просто l oop поверх свойств, которые имеют пустое значение (снова используя отражение) и сделать их недействительными. Надеюсь, что это понятно, или в случае вопросов, пожалуйста, прокомментируйте.

Примечания:

  1. Чтобы очистить свойство - отправьте пустую строку,
  2. Чтобы сохранить то же свойство - отправьте Null
  3. keyNames - это свойства первичного ключа, которые не могут быть обновлены, поэтому код просто обновляет все предоставленные не нулевые свойства, которые не являются частью ключа
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...