2017-01-02 31 views
2

可以爲GET和POST操作使用不同的DTO嗎?WebApi不同的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; } 
} 

我應該這樣做的原因是,我在發佈資源時不需要Id,但需要密碼。在使用GET時反過來。

這是使用WebApi(爲響應和請求創建不同的Dtos)的正確方法嗎?或者有其他方法可以做到這一點嗎?

+0

是否這是正確的方法是一個意見。公開或接受系統按預期執行的必要信息。每個動作都可以使用自己的dto。並不意味着它應該。 – Nkosi

+0

如果您使用映射技術,則可以修改dto的映射以符合您的標準。 –

回答

3

可以爲GET和POST操作使用不同的DTO嗎?

對於不同的動作有不同的dto是沒有問題的。

如果第三方正在使用api,那麼您應該確保它已經被充分記錄。

這是使用WebApi時的正確方法嗎?

是否這是正確的方法是一個意見。公開或接受系統按預期執行的必要信息。

每個動作都可以使用自己獨特的dto。並不意味着它應該。你想確保你沒有泄露超出必要信息的信息。

+0

如果這是一個意見問題,有沒有其他的選擇? –

+0

太多了,因爲它取決於*。你的方法仍然可以工作。 – Nkosi