WebApi用于Get和Post的不同DTO

时间:2017-01-02 12:43:40

标签: c# asp.net-web-api

GET和POST操作有不同的DTO可以吗?

原因是这两种数据模型之间通常存在巨大差异。

例如:

我的帖子看起来像这样:

/// <summary>
/// Add new user
/// </summary>
/// <param name="item">User data</param>
/// <returns>Newly added user id</returns>
[HttpPost]
public IHttpActionResult Post([FromBody] UserDto item)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var model = _mapper.Map<User>(item);

    int itemid = _usersRepository.Insert(model);

    return Ok(itemid);
}

public class UserDto
{
    private string _password;

    [Required]
    [StringLength(100, ErrorMessage = "Name {0} must consist of at least {2} letters.", MinimumLength = 6)]
    public string Name { get; set; }

    [Required]
    public string ExternalName { get; set; }

    [Required]
    public bool Active { get; set; }

    [Required]
    public string Password
    {
        get { return _password; }
        set { _password = value.Hash(); }
    }
}

我的GET看起来像这样:

/// <summary>
/// Get all users
/// </summary>
/// <returns>Users list</returns>
[HttpGet]
[ResponseType(typeof(List<UserInfoDto>))]
public IHttpActionResult Get()
{
    IList<UserInfoDto> values = _usersRepository.SelectAll();

    if (values == null || !values.Any())
        return Ok();

    return Json(new { collection = values });
}

public class UserInfoDto
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string ExternalName { get; set; }

    public bool Active { get; set; }
}

我这样做的原因是,在POST资源时我不需要Id,但需要密码。使用GET时会反过来。

使用WebApi(为响应和请求创建不同的Dtos)时,这是正确的方法吗?或者还有其他方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:4)

  

GET和POST操作有不同的DTO可以吗?

对于不同的行为,有不同的dto是没有错的。

如果第三方正在使用api,您需要确保它已被充分记录。

  

使用WebApi时这是正确的方法吗?

这是否是正确的方法是一个意见问题。公开或接受系统按预期执行的必要信息。

每个动作都可以使用自己独特的dto。并不意味着它应该。您希望确保没有泄漏超出必要的信息。