2016-08-04 6 views
5

私は単純なメッセージをユーザーに送信するAPIを持っているとしましょう。今、私は(自動的に割り当てられた)すべての送信されたメッセージを読んで、それを送信するユーザーと(私はクッキーにアイデンティティを持っていた)との時間を送信したいWeb APIのオブジェクトを読み込んで更新するための2つの異なるモデルクラスを用意する必要がありますか?

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

:それを送信するには、私のようなものを使用します。私の問題は、オブジェクトどのようなことです

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

:私は二つの方法があります

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

APIコントローラ側から:

GET api/messages 

と私が取得します:再び簡単なことのようです私は何を得るのですか?だから私は同じMessageクラスを使うことはできないと思う。なぜ私はしなければならない:

  • 私はそれを適切な方法でここに2つのクラスがありますか? (私はコードを書く必要があり、それはRESTの観点からは正しいのか分かりません)
  • 私は1つのクラスを使うべきですが、ユーザーがそれを私に送るなら、FromとTimeプロパティを無視するべきですか?
  • FromとTimeを送信するようにユーザーに通知する必要がありますが、ここでnullを送信しますか?
+2

DTO(データ転送オブジェクト)としてワイヤを介して送信されるオブジェクトを考えてください。通常は、必要なものだけを電信で送信するようにしてください。だからあなたのjavascriptクライアントは、apiが期待しているものだけを構築すべきです。 fromとtimeがクライアントが提供する必要がないものであれば、そうではありません。セキュリティの観点からは、クライアントに必要な情報よりも多くの情報を漏らしたくはありません。 – Nkosi

答えて

4

DTO(データ転送オブジェクト)としてワイヤを介して送信されるオブジェクトを考えてください。通常は、必要なものだけを電信で送信するようにしてください。

クライアントは、apiが期待するものだけを構築する必要があります。 FromTimeがクライアントが提供する必要がないデータである場合、クライアントはそれを提供すべきではありません。

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; 
    } 
} 
関連する問題