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)时,这是正确的方法吗?或者还有其他方法可以做到这一点吗?
答案 0 :(得分:4)
GET和POST操作有不同的DTO可以吗?
对于不同的行为,有不同的dto是没有错的。
如果第三方正在使用api,您需要确保它已被充分记录。
使用WebApi时这是正确的方法吗?
这是否是正确的方法是一个意见问题。公开或接受系统按预期执行的必要信息。
每个动作都可以使用自己独特的dto。并不意味着它应该。您希望确保没有泄漏超出必要的信息。