2016-08-04 15 views
5

Kullanıcılara basit mesajlar gönderen bir API’m olduğunu varsayalım.Web API'sındaki nesneyi okumak ve güncellemek için iki farklı model sınıfım olmalı mı?

POST { 
     Content: "Message here", 
     To: "[email protected]" 
} api/messages 

Şimdi tüm gönderilen mesajları okumak istiyorum ama göndermek (ı çerezdeki kimliğini vardı) ve saati (otomatik olarak atanan) göndermek kullanıcı ile: göndermek için ben gibi bir şey kullanmak.

GET api/messages 

ve alacağım:: Yine basit gibi görünüyor API kontrol tarafında

[{ 
    Content: "Message here", 
    To: "[email protected]", 
    From: "user1", 
    Time: "0001-01-01T00:00:00" 
}] 

Ben iki yöntem olacaktır:

public class MessagesController : ApiController 
{ 
    [HttpPost, Route("Messages")] 
    public HttpResponseMessage Post([FromBody] Message message) 
    { 
     messageRepository.Create(message); 
     return Request.CreateResponse(HttpStatusCode.Created, "Message was send."); 
    } 

    [HttpGet, Route("Messages")] 
    public HttpResponseMessage Get() 
    { 
     var response = new HttpResponseMessage(HttpStatusCode.OK) 
     { 
      Content = new StringContent(JsonConvert.SerializeObject(messageRepository.GetMessages())) 
     }; 
     response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); 
     return response; 
    } 
} 

Benim sorun olduğunu nesne nedir gönderim aldığım nesneden farklı. Bu yüzden aynı Message sınıfını kullanamayacağımı düşünüyorum. Neden yapmalıyım?

  • Uygun şekilde yapabilmek için iki farklı dersim olmalı mı? (Daha fazla kod yazacağım ve Bilmiyorum REST bakış açısıyla doğrudur)
  • Bir sınıf kullanmalıyım, ancak kullanıcı bana gönderecekse Kimden ve Zaman özelliklerini görmezden gelmeli miyim?
  • Kullanıcımdan Bana Gönderme Zamanı göndermesini söylemeliyim ama null gönderelim mi?
+2

Tel üzerinden gönderilen nesnelerin DTO'lar (Veri Transferi Nesneleri) olarak düşünün. Genelde sadece tel üzerinden gerekenleri göndermeniz tavsiye edilir. Javascript istemciniz sadece api'nin beklediği şeyi yapmalıdır. Zaman ve danışanın müşterinin sağlaması gerekmediği bir şey varsa o zaman yapmamalı. Güvenlik açısından, müşteri için gerekli olandan daha fazla bilgi sızdırmak istemezsiniz. – Nkosi

cevap

4

Tel üzerinden gönderilen nesnelerin DTO'lar (Veri Transferi Nesneleri) olarak düşünün. Genelde sadece tel üzerinden gerekenleri göndermeniz tavsiye edilir.

Böylece, istemciniz yalnızca api'nin beklediği şeyi oluşturmalıdır. From ve Time ise, istemcinin sunması gerekmediği verilerdeyse, bu yapılmamalıdır.

public class PostMessageDto { 
    public string Content { get; set; } 
    public string To {get; set; } 
} 

Güvenlik açısından, istemci için gerekli olandan daha fazla bilgi sızdırmak istemezsiniz. Varlıklarınız açığa çıkarmak istediğinizden daha fazla bilgi açığa çıkarsa, yalnızca istemciye gönderilmesini istediğiniz ayrıntıları iletecek bir model oluşturmanız gerekir.

public class MessagesController : ApiController { 
    //POST api/messages 
    [HttpPost, Route("Messages")] 
    public HttpResponseMessage Post([FromBody] PostMessageDto message) { 
     var entity = new Message { 
      Content = message.Content, 
      To = message.To 
     }; 
     messageRepository.Create(entity); 
     return Request.CreateResponse(HttpStatusCode.Created, "Message was send."); 
    } 

    //GET api/messages  
    [HttpGet, Route("Messages")] 
    public HttpResponseMessage Get() { 
     var entities = messageRepository.GetMessages(); 

     //..you can put code here that creates the data you want returned. 
     var responseData= entities.Select(x => new { 
      Content = x.Content, 
      To = x.To, 
      From = x.From, 
      Time = x.Time 
     }); 

     var response = Request.CreateResponse(HttpStatusCode.OK, responseData); 
     response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); 
     return response; 
    } 
}