Мы Создаем Наше Первое Приложение, Используя Nancyfx. Часть Четвертая. Продолжаем Работать С Модулями

В предыдущей статье Мы создаем наше первое приложение, используя NancyFX. Часть третья.

Модули Нэнси.

мы познакомились с модулями Нэнси.

В этой статье мы продолжим их изучать.

Как я упоминал в предыдущей статье, Нэнси использует свойство запроса Request.Form. Форма — это DynamicDictionary, значения которого берутся из тела запроса.

Чтобы Нэнси правильно разобрала значения, отправленные в теле запроса, необходимо правильно установить Content-Type: application/x-www-form-urlencoded. Если Content-Type был указан неправильно, не удивляйтесь, если в качестве значений вы получите нули.

Нэнси автоматически анализирует только данные в формате x-www-form-urlencoded. Итак, попробуем создать модуль, обрабатывающий Post-запрос.

Сначала давайте создадим следующий класс:

  
  
  
  
  
  
  
  
   

namespace NancyFxApplication { public class Dish { public int Id { get; set; } public string Name { get; set; } public bool IsSpicy { get; set; } } }

и класс

using System.Collections.Generic; namespace NancyFxApplication { public static class DishesRepository { public static List<Dish> Dishes = new List<Dish> { new Dish { Id=1, Name = "Porridge", IsSpicy = false}, new Dish {Id = 2, Name = "Chili", IsSpicy = true}, new Dish {Id = 3, Name = "Icecream", IsSpicy = false} }; public static List<Dish> GetAllDishes() { return Dishes; } public static void AddDish(Dish dish) { Dishes.Add(dish); } } }

Далее мы определим новый модуль Нэнси.



using Nancy; namespace NancyFxApplication { public class DishModule : NancyModule { public DishModule() : base("/Dish") { Post["/Add"] = ctx => { var dish = new Dish {Id = Request.Form.Id, Name = Request.Form.Name, IsSpicy = Request.Form.IsSpicy}; DishesRepository.AddDish(dish); return new Response { StatusCode = HttpStatusCode.Accepted }; }; Get["/GetAll"] = ctx => Response.AsJson(DishesRepository.GetAllDishes()); } } }

Теперь после запуска приложения и перехода по маршруту Dish/GetAll мы получаем следующий результат

[ {"Id":1,"Name":"Porridge","IsSpicy":false}, {"Id":2,"Name":"Chili","IsSpicy":true}, {"Id":3,"Name":"Icecream","IsSpicy":false} ]

Теперь давайте воспользуемся скрипачом и сделаем запрос Post на маршрут Dish/Add.

Мы создаем наше первое приложение, используя NancyFX. Часть четвертая.
</p><p>
 Продолжаем работать с модулями

И снова мы делаем запрос Get для маршрута Dish/GetAll и получаем

[ {"Id":1,"Name":"Porridge","IsSpicy":false}, {"Id":2,"Name":"Chili","IsSpicy":true}, {"Id":3,"Name":"Icecream","IsSpicy":false}, {"Id":1,"Name":"Borsh","IsSpicy":false} ]

Как видите, все работает. Однако x-www-form-urlencoded подходит только для простых форматов данных.

Но он не подходит для сложных данных.

Для передачи сложных форматов данных помогут JSON и XML. Давайте изменим класс Dish следующим образом:

public class Dish { public int Id { get; set; } public string Name { get; set; } public bool IsSpicy { get; set; } public List<Ingridients> Ingridientses { get; set; } }

Добавим класс в наш проект:

public class Ingridients { public int Id { get; set; } public string Name { get;set; } }

Нэнси включает два десериализатора для двух семейств типов контента.

Для JSON("application/json", "text/json", "application/vnd.+json") и XML("application/xml", "text/xml", "application/vnc.+xml" " ").

Nancy также можно расширить для работы с другими типами контента, такими как буферы протокола, CSV и т. д. Вы даже можете написать свой собственный десериализатор для вашего типа контента.

Итак, давайте изменим наш модуль, чтобы он мог принимать данные в формате JSON.

using Nancy; using Nancy.ModelBinding; namespace NancyFxApplication { public class DishModule : NancyModule { public DishModule() : base("/Dish") { Post["/Add"] = ctx => { var dish = this.Bind<Dish>(); DishesRepository.AddDish(dish); return new Response { StatusCode = HttpStatusCode.Accepted }; }; Get["/GetAll"] = ctx => Response.AsJson(DishesRepository.GetAllDishes()); } } }

Метод Bind — это метод расширения, расположенный в пространстве имен Nancy.ModelBinding. Это позволяет вам сопоставить JSON с вашим бизнес-объектом.

Теперь, если вы запустите приложение и сделаете следующий запрос POST в скриптере к маршруту «/Add»

Мы создаем наше первое приложение, используя NancyFX. Часть четвертая.
</p><p>
 Продолжаем работать с модулями

Затем мы выполняем Dish/GetAl и получаем

[ {"Id":1,"Name":"Porridge","IsSpicy":false,"Ingridientses":null}, {"Id":2,"Name":"Chili","IsSpicy":true,"Ingridientses":null}, {"Id":3,"Name":"Icecream","IsSpicy":false,"Ingridientses":null}, {"Id":12,"Name":"Salad","IsSpicy":false, "Ingridientses":[{"Id":1,"Name":"Salad"}]} ]

Как видите, наша модель принимается приложением и записывается в наш поддельный репозиторий.

В заключение хотелось бы оговориться по поводу дезириализации формата XML. Чтобы использовать Bind, свойства бизнес-объекта должны быть помечены атрибутами, как мы делаем это при обычной XML-сериализации.

В этом случае у нас будет гарантия, что объект будет распределен корректно.

В следующей статье мы рассмотрим графический движок Super Simple View Engine. Жду ваших комментариев и вопросов.

Теги: #.

NET #nancefx #asp.net mvc #.

NET

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.