Разрушает ли строгая типизация HTTP PUT? - PullRequest
0 голосов
/ 01 марта 2019

У меня проблемы с обновлениями в клиенте Api C #, сгенерированном с помощью NSwag, и с использованием глагола HTTP PUT.

Допустим, у меня есть DTO с именем customer

public class CustomerDTO
{
    public int id { get; set; }
    public string name{ get; set; }
    public string email { get; set; }
}

У меня есть клиент этого клиента C #, который хочет изменить электронную почту клиента.

Поэтому он создает вызов CustomerPut для замены ресурса.

CustomerDTO customer = await CustomerGet(); // Performs a get on the entity
customer.email = "newemail@abc.com";
await CustomerPut(customer);

Все в порядке длямомент.

Проблема возникает, когда я решил добавить новое поле в CustomerViewModel

public class CustomerDTO
{
    public int id { get; set; }
    public string name{ get; set; }
    public string email { get; set; }
    public string? likesApples {get; set;}
}

Если я когда-либо сделаю это, код в моем потребителе должен быть обновлен, или он будетсбросить свойство likesApples.Это означает, что значение likesApples будет стираться каждый раз, когда устаревший клиент пытается что-то обновить.

Есть ли решение, чтобы мне не приходилось обновлять мой код клиента для каждого нового простого поля, которое я хочу добавить?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Вы можете написать другой API для Put.Это код psuedo, так что простите, если не компилируется.

Возьмите email и customerUpdateRequest из запроса пут.и установите значение клиента с помощью propertyName и отражения.Если вы используете EF, вы можете выбрать своего клиента из БД и изменить, какое поле вы хотите.

[HttpPut]
public JsonResult UpdateCustomerValues(string email, CustomerUpdateRequest request)
{
    var customer = new Customer();
    customer.Email=email;
    PropertyInfo propertyInfo = customer.GetType().GetProperty(request.propertyName);
    propertyInfo.SetValue(customer, Convert.ChangeType(request.value, propertyInfo.PropertyType), null);

}

public class CustomerUpdateRequest
{
    public string propertyName{get;set;}
    public string value{get;set;}

}
0 голосов
/ 06 марта 2019

Есть ли решение, поэтому мне не нужно обновлять мой клиентский код для каждого нового простого поля, которое я хочу добавить?

Управление версиями вашего API.Используя PUT, вы назначаете данный ресурс данному идентификатору, перезаписывая предыдущую версию этого ресурса.

Добавление нового поля к ресурсу требует нового контракта, поэтому новая версия API.

Если вы хотите продолжать добавлять новые поля и разрешать частичные обновления, изучите PATCH.

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