body

Nancy – zasłanianie się danych podczas bindowania z POST

Posted on Updated on

Mamy następujący kawałek kodu. Nancy – moduł REST który coś tam robi.

public class TopicsModule : NancyModule
{
    public class Note
    {
        public int Id { get; set; }
        public string Content { get; set; }
    }

    public TopicsModule()
        : base("/api/topics")
    {
        Post["/{id:int}"] = parameters =>
        {
            var id = (int)parameters.id.Value;

            Note note = this.Bind<Note>();
            // note.Id == ?
          
            // ...
        }
    }
}

Wywołujemy request typu POST pod adres http://localhost/api/topics/11 z następującym body:

{ 
  id: 44, 
  content: 'nowy tekst'
}

Teraz pytanie – Jaka będzie wartość note.Id?

Spodziewałem się wartości 44 i trochę się namęczyłem szukając dlaczego nie jest to 44.
Mechanizm bindowania działa tak, że najpierw brane są wartości z URLa, później z Query stringa, a dopiero na końcu z body requestu. W powyższym przypadku note.Id wynosić więc będzie 11.

Musimy więc w kodzie zapewnić aby nie było kolizji tych nazw, np:

public class TopicsModule : NancyModule
{
    public class Note
    {
        public int Id { get; set; }
        public string Content { get; set; }
    }

    public TopicsModule()
        : base("/api/topics")
    {
        Post["/{topicId:int}"] = parameters =>
        {
            var topicId = (int)parameters.topicId.Value;

            Note note = this.Bind<Note>();
            // note.Id == 44
          
            // ...
        }
    }
}