2016-08-04 8 views
5

मान लें कि मेरे पास एक एपीआई है जो उपयोगकर्ताओं को सरल संदेश भेजती है।क्या मेरे पास वेब एपीआई में ऑब्जेक्ट को पढ़ने और अपडेट करने के लिए दो अलग-अलग मॉडल कक्षाएं होनी चाहिए?

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

अब मैं पूरी तरह से भेजे गए संदेशों को पढ़ने के लिए चाहते हैं, लेकिन उपयोगकर्ता के लिए जो इसे भेजने (मैं कुकी में पहचान थी) और समय (स्वचालित रूप से आवंटित) भेजने के साथ: यह भेजने के लिए मैं कुछ इस तरह का प्रयोग करेंगे। फिर यह आसान लगता है:

GET api/messages 

और मैं मिल जाएगा:

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

एपीआई नियंत्रक की ओर से मैं दो तरीकों होगा:

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; 
    } 
} 

मेरे समस्या यह है कि वस्तु क्या भेजना मुझे वस्तु से अलग है जो मुझे मिलता है। तो मुझे लगता है कि मैं एक ही संदेश वर्ग का उपयोग नहीं कर सकता। मुझे तब क्यों करना चाहिए:

  • क्या मेरे पास उचित तरीके से करने के लिए यहां दो अलग-अलग कक्षाएं होनी चाहिए? (मेरे पास कोड के लिए और अधिक होगा और मुझे नहीं पता कि यह आरईएसटी दृष्टिकोण से सही है)
  • क्या मुझे एक वर्ग का उपयोग करना चाहिए, लेकिन अगर उपयोगकर्ता इसे मुझे भेज देगा तो समय और समय गुणों को अनदेखा कर देना चाहिए?
  • क्या मुझे अपने उपयोगकर्ता को मुझे समय और समय भेजने के लिए कहा जाना चाहिए लेकिन यहां शून्य भेजना चाहिए?
+2

वस्तुओं की Think DTOs (डाटा ट्रांसफर वस्तुओं) के रूप में तार पर भेजा जा रहा है। आमतौर पर यह सलाह दी जाती है कि आपको केवल तार पर जरूरी भेजना चाहिए। तो आपका जावास्क्रिप्ट क्लाइंट केवल एपीआई की अपेक्षा करता है। यदि समय और समय ऐसा कुछ है जिसे क्लाइंट को प्रदान करने की आवश्यकता नहीं है तो उसे नहीं करना चाहिए। एक सुरक्षा परिप्रेक्ष्य से आप ग्राहक के लिए आवश्यकतानुसार अधिक जानकारी लीक नहीं करना चाहते हैं। – Nkosi

उत्तर

4

वस्तुओं की Think DTOs (डाटा ट्रांसफर वस्तुओं) के रूप में तार पर भेजा जा रहा है। आमतौर पर यह सलाह दी जाती है कि आपको केवल तार पर जरूरी भेजना चाहिए।

तो आपके ग्राहक को केवल एपीआई की अपेक्षा करना चाहिए। यदि From और Time वह डेटा है जिसे क्लाइंट को प्रदान करने की आवश्यकता नहीं है तो उसे नहीं करना चाहिए।

public class PostMessageDto { 
    public string Content { get; set; } 
    public string To {get; set; } 
} 
एक सुरक्षा परिप्रेक्ष्य आप अधिक जानकारी की तुलना में ग्राहक के लिए आवश्यक है लीक करने के लिए नहीं करना चाहती से

। यदि आपकी संस्थाएं आपके द्वारा उजागर होने की अपेक्षा अधिक जानकारी उजागर कर रही हैं तो आपको केवल उस विवरण को पास करने के लिए एक मॉडल बनाना चाहिए जिसे आप क्लाइंट को भेजना चाहते हैं।

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; 
    } 
} 
संबंधित मुद्दे