Пишем RESTful веб-сервис на ASP.NET
Как известно, веб-сервисы можно создавать на разных языках. Давайте напишем REST-приложение, используя .NET и Visual Studio. Результат — веб-сервис, работающий со следующим набором данных «туториалов»:
Будут реализованы следующие RESTful-методы: • GET Tutorial (при вызове клиент получит все доступные TutorialName); • GET Tutorial/TutorialId (при вызове клиент получит TutorialName, соответствующий переданному TutorialId); • POST Tutorial/TutorialName (при вызове клиент отправит запрос на добавление туториала с переданным TutorialName); • DELETE Tutorial/TutorialId (при вызове клиент отправит запрос на удаление туториала с TutorialName, которое соответствует переданному TutorialId).
Итак, перейдём к поэтапному созданию веб-сервиса.
Этап № 1
В первую очередь, создаём пустое ASP.NET web-приложение. Для этого открываем Visual Studio и создаём новый проект:
Далее должно появиться новое диалоговое окно.
Этап № 2
В открывшемся окне переходим по вкладкам C# → Веб. И выбираем опцию «Веб-приложение ASP.NET (.NET Framework)», а потом вводим нужные данные вашего проекта (название, каталог):
В итоге должно открыться окно, где можно увидеть наш проект:
Этап № 3
Теперь нам надо создать файл будущего RESTful веб-сервиса. Для этого кликаем правой кнопкой по файлу проекта Webservice.REST (также можно нажать Ctrl+Shift+A) и выбираем опции Add->new item:
Откроется окно, где находим опцию «WCF Service (с поддержкой технологии AJAX)» и даём ей имя TutorialSevice.svc. После выбора этой опции Visual Studio создаст код, который станет основой для реализации web-сервиса. В нашем случае WCF (Windows Communication Foundation) — это библиотека, используемая для налаживания взаимодействия между приложениями посредством разных протоколов типа TCP, HTTP и HTTPS. Что касается AJAX, то эта технология позволяет асинхронно обновлять web-страницы и обмениваться небольшими объёмами данных с сервером.
Этап № 4
Теперь надо внести изменения в Web.config. Это конфигурационный файл, который содержит настройки, нужные для правильной работы приложения. Таким образом, наше изменение позволит приложению отправлять и принимать данные как RESTful веб-сервис.
Открываем конфигурационный файл:
В открывшемся файле находим строку <enableWebScript />:
и меняем её на <webHttp />:
Этап № 5
Теперь можно браться за код. Открываем файл TutorialService.svc и сначала добавим код для отображения наших данных. Для этого создаём список со строками «Queues», «Arrays» и «Stacks». Эти строки будут отражать имена доступных туториалов:
namespace Webservice.REST { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed public class TutorialService { private static List lst = new List (new String[] {"Arrays","Queues","Stacks"});
Этап № 6
Теперь давайте напишем код для метода GET в этом же файле. Данный метод станет запускаться при каждом вызове сервиса из веб-браузера. Он будет применяться для получения доступных туториалов:
[WebGet(UriTemplate="/Tutorial")] public String GetAllTutorial() { int count = 1st.Count; String TutorialList = ""; for (int i = 0; i < count; i++) TutorialList = TutorialList + lst[i] + ","; return TutorialList; }
Обратите внимание на строку [WebGet(UriTemplate="/Tutorial")] — она очень важна и необходима для определения, как мы будем вызывать данный метод по URL. К примеру, если наш сервис расположен по адресу http://localhost:52645/TutorialService.svc, а в его конец мы добавим «/Tutorial» и получим http://localhost:52645/TutorialService.svc/Tutorial, то будет вызван вышенаписанный код.
Атрибут WebGet — это параметр, позволяющий
Что касается самого метода
Этап № 7
Идём далее. Нижеуказанный код необходим, чтобы вернуть соответствующий TutorialName при получении GET-запроса с TutorialId:
[WebGet (UriTemplate = "/Tutorial/{Tutorialid}")] public String GetTutorialbyID(String Tutorialid) { int pid; Int32.TryParse(Tutorialid, out pid); return lst[pid]; }
Как и в примере выше, первая строка — наиболее важна, ведь она определяет, как мы будем вызывать данный метод. Если мы сделаем запрос http://localhost:52645/TutorialService.svc/Tutorial/1, то web-сервис должен вернуть TutorialName, соответствующий TutorialId с индексом 1.
Реализует описанную логику метод
Этап № 8
Теперь пришла очередь кода для метода POST, который мы будем вызывать каждый раз, когда захотим добавить строку в наш список туториалов посредством POST-запроса:
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "/Tutorial", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] public void AddTutorial(string str) => lst.Add(str);
На первой строке — атрибут WebInvoke, прикреплённый к методу, — это позволяет вызывать его посредством POST-запроса. Что касается атрибутов RequestFormat и ResponseFormat, то мы указываем для них JSON, так как именно с этим форматом функционирует RESTful веб-сервис.
Этап № 9
Что же, теперь добавим метод для работы с DELETE-запросами. Этот метод станет вызываться каждый раз, когда мы будем пытаться удалить имеющееся значение из списка посредством DELETE-запроса:
[WebInvoke(Method = "DELETE", RequestFormat = WebMessageFormat.Ison, UriTemplate = "/Tutorial/{Tutorialid}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] public void DeleteTutorial(String Tutorialid) { int pid; Int32.TryParse(Tutorialid, out pid); 1st.RemoveAt(pid); }
Первая-вторая строки не имеют ничего особенного и, по сути, не отличаются от предыдущих методов, сигнализируя о том, что нижеуказанный метод станет вызываться при каждом DELETE-запросе.
Что касается метода
В результате код должен выглядеть так (без учёта элементов, бывших там изначально):
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Activation; using System.ServiceModel.Web; using System.Text; namespace Webservice.REST { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class TutorialService { private static List<string> lst = new List<string> { "Arrays", "Queues", "Stacks" }; [WebGet(UriTemplate = "/Tutorial")] public string GetAllTutorials() => String.Join(",", lst); [WebGet(UriTemplate = "/Tutorial/{TutorialId}")] public string GetTutorialByID(string TutorialId) { int pid; if (!TryParse(TutorialId, out pid)) { throw new HttpResponseException("TutorialId must be an integer", HttpStatusCode.BadRequest); } return lst[pid]; } [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "/Tutorial", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] public void AddTutorial(string str) => lst.Add(str); [WebInvoke(Method = "DELETE", RequestFormat = WebMessageFormat.Json, UriTemplate = "/Tutorial/{TutorialId}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] public void DeleteTutorial(string TutorialId) { int pid; if (!TryParse(TutorialId, out pid)) { throw new HttpResponseException("TutorialId must be an integer", HttpStatusCode.BadRequest); } lst.RemoveAt(pid); } } }
Вот и всё, RESTful веб-сервис на ASP.NET создан! Теперь нужно его запустить и протестировать. Но об этом поговорим в следующий раз.
Источник: «RESTful Web Services Tutorial with Example».