В предыдущей статье Мы создаем наше первое приложение, используя 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.
И снова мы делаем запрос 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»
Затем мы выполняем 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
-
Intel ❄ 2017. Итоги Года
19 Oct, 24 -
Fixprice Agile Или Scrum Через Zhiru
19 Oct, 24 -
Жизнь Становится Лучше
19 Oct, 24 -
Краткое Введение В Тензоры
19 Oct, 24 -
Выставка Вакуумтехэкспо 2017
19 Oct, 24