Главная страница   /   24.2. Добавление веб-служб в приложение "Guestbook" (ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

Джеффри Палермо

24.2. Добавление веб-служб в приложение "Guestbook"

Напомним, что приложение "Guestbook" позволяет пользователю добавлять новые записи, а также просматривать все записи. Рисунок 24-3 демонстрирует, что в настоящее время в базе данных находится две записи.

Рисунок 24-3: Мы добавим веб-службу в существующую функциональность "Guestbook".

Мы расширим это приложение с помощью добавления веб-службы, которая возвращает записи в базу данных. В следующем разделе рассматриваются шаги, необходимые для того, чтобы добавить эту новую веб-службу с помощью возможностей Web API. Посредством этого примера мы покажем, каким простым может быть процесс разработки HTTP веб-служб с помощью Web API.

Создание GET веб-службы

В ASP.NET MVC вы увидите роут, который преднастроен таким образом, чтобы поддерживать Web API веб-службы. В файле Global.asax.cs вы увидите блок кода, который похож на следующий:

routes.MapHttpRoute(
		name: "DefaultApi",
		routeTemplate: "api/{controller}/{id}",
		defaults: new { id = RouteParameter.Optional }
);

Данный код определяет структуру роута очень похожую на структуру обычного, используемого по умолчанию MVC роута, но он добавляет к путю префикс "api". Используя такую структуру роута, мы сконструируем API контроллер, который будет доступным по адресу http://localhost:{port}/api/guestbookentry.

Следующий листинг демонстрирует контроллер с реализованным действием GET.

Листинг 24-3: Реализация действия GET также проста, как и создание метода
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using GuestBook.Models;
using Guestbook.Models;
namespace GuestBook.Controllers
{
	public class GuestbookEntryController : ApiController
	{
		private IGuestbookRepository _repository;
		public GuestbookEntryController()
		{
			_repository = new GuestbookRepository();
		}
		public GuestbookEntryController(
		IGuestbookRepository repository)
		{
			_repository = repository;
		}
		// GET api/guestbookentry
		public IEnumerable<GuestbookEntry> Get()
		{
			var mostRecentEntries = _repository.GetMostRecentEntries();
			return mostRecentEntries;
		}
		// GET api/guestbookentry/5
		public GuestbookEntry Get(int id)
		{
			var entry = _repository.FindById(id);
			if (entry == null)
				throw new HttpResponseException(HttpStatusCode.NotFound);
			return entry;
		}
	}
}

Строка 12: Интерфейс для уровня данных

Строка 18: Конструктор для тестирования

Строка 23: GET, используемый по умолчанию для перечисления записей

Строка 29: Единоразовое использование GET для идентифицированных записей

Вы уже знакомы с базовым классом, необходимым для того, чтобы разработать контроллер для простой HTTP веб-службы с помощью ASP.NET Web API. Этот класс будет использовать уровень данных, очень схожий с регулярным MVC контроллером. Этот класс также обладает конструктором для тестирования. Затем есть два простых метода, которые отличаются своими параметрами. Непараметризованный метод будет обрабатывать URL, в которые не добавляются ID записей. Второй метод будет принимать запросы, которые отмечены ID.

Используя Internet Explorer для обращения к этому URL, вы можете перехватить отклик в JSON формате, как это продемонстрировано ниже:

[
	{"Id":2,"Name":"Jeffrey Palermo"
		,"Message":"You think you're excited. I'm so excited,
			I could quote Mark Dunn."
		,"DateAdded":"\/Date(1333745294610-0500)\/"}
	,{"Id":1,"Name":"Jimmy Bogard"
		,"Message":"I am so jazzed up about Web API!"
		,"DateAdded":"\/Date(1333745240097-0500)\/"}
]

При использовании этого веб-сервиса вы можете увидеть, как легко будет вызвать эту веб-службу из jQuery, C# или кода любого другого вида, и вернуть данные для записей в "Guestbook". Следующий шаг – присоединить возможность добавления записей с помощью веб-службы.

Создание POST веб-службы

Наиболее универсальные HTTP операции (HTTP verbs) – это GET и POST. Наиболее универсальное применение операции POST при использовании веб-служб – это изменение состояния системы. К нему может относиться получение AJAX вызовов из jQuery или прием команд из других компьютерных систем. В данном разделе вы увидите код, реализующий веб-службу, которая может получать HTTP POST и записывать новую запись гостевой книги

При приеме команды из другой системы или из JavaScript на веб-странице важно проверять достоверность данных в запросе. Обычно HTTP веб-служба отображает внешнюю границу системы, поэтому вы не можете доверять стороннему клиенту. Если только вы явно не обезопасили вашу веб-службу таким образом, чтобы она использовалась только защищенными клиентами и промежуточными сетевыми транспортами, то разумно будет проверять достоверность и тестировать все данные, полученные в качестве входных.

Листинг 24-4 демонстрирует действие POST, необходимое для того, чтобы обрабатывать запрос создания новой записи в "Guestbook".

Листинг 24-4: Действие POST проверяет и обрабатывает входные данные
// POST api/guestbookentry
public HttpResponseMessage Post(GuestbookEntry value)
{
	if (!ModelState.IsValid)
	{
		var errors =
				(from state in ModelState
					where state.Value.Errors.Any()
					select new
					{
						state.Key,
						Errors = state.Value.Errors.Select(
								error => error.ErrorMessage)
					})
				.ToDictionary(error => error.Key, error => error.Errors);
		return Request.CreateResponse(HttpStatusCode.BadRequest, errors);
	}
	_repository.AddEntry(value);
	var response = Request.CreateResponse(
			HttpStatusCode.Created,
			value, Configuration);
	response.Headers.Location = new Uri(Request.RequestUri,
			"/api/guestbookentry/" + value.Id);
	return response;
}

Строка 2: Принимает сложный объект

Строка 4: Вызывает model state

Строка 16: Возвращает код ошибки

Строка 20-21: Возвращает код успеха

Важно здесь отметить, что Web API разрабатывается поверх новой исполняющей среды ASP.NET, которая не разделяет зависимость от System.Web.dll. Эта новая исполняющая среда зависит от System.Web.dll и реализует HTTP образец, а код, который вы видите, строго соответствует этим понятиям. Даже если базовый фреймворк другой, концепция модели связывания данных все еще существует. Метод Post() в листинге 24-4 принимает сложный объект в качестве параметра. Свойства этого объекта, как обычно, стягиваются из HTTP запроса. Аналогично, процесс валидации используется такой же, как при использовании model state. Если встречается ошибка, то код может вернуть должный код ошибки и сообщение, или он может вернуть должный код успеха после обработки запроса.

Для того чтобы вызвать эту конечную точку POST, мы будем использовать средство под названием Fiddler, которое находится в свободном доступе на сайте www.fiddler2.com. На рисунке 24-4 вы можете увидеть POST-запрос.

Рисунок 24-4: Fiddler позволяет нам очень легко создавать HTTP-запросы.

С помощью Fiddler вы можете задать тип контента application/json данных и добавить тело запроса с именем и сообщением, которые взаимосвязаны со свойствами объекта GuestbookEntry. Нажмите на кнопку Execute, и Fiddler отошлет POST-запрос в ваше приложение. Далее вы можете перейти на вкладку Inspectors и увидеть необработанный отклик, продемонстрированный на рисунке 24-5.

Рисунок 24-5: Инструмент демонстрирует успешный отклик.

Рисунок 24-5 демонстрирует успешное добавление записи в "Guestbook" посредством новой веб-службы, приводимой в действие с помощью Web API. Давайте подтвердим, что обычное веб-приложение "Guestbook" также может иметь доступ к этой записи. Рисунок 24-6 демонстрирует записи с помощью веб-интерфейса.

Рисунок 24-6: Страница записей "Guestbook" демонстрирует новую запись, опубликованную посредством Web API контроллера.

Теперь вы увидели, каким простым может быть создание HTTP веб-служб с помощью новых возможностей Web API в ASP.NET MVC. Вероятно, данный подход удовлетворит 80 процентов ваших потребностей в HTTP веб-службах. Для остальных веб-служб, для которых требуется другой транспорт или типы формата, вы все еще можете использовать WCF.