Пишем RESTful веб-сервис на ASP.NET | OTUS

Пишем RESTful веб-сервис на ASP.NET

Asp_net_Deep_29.4-5020-fb163d.png

Как известно, веб-сервисы можно создавать на разных языках. Давайте напишем REST-приложение, используя .NET и Visual Studio. Результат — веб-сервис, работающий со следующим набором данных «туториалов»:

1-20219-e34c18.png

Будут реализованы следующие 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-20219-f9801a.png

Далее должно появиться новое диалоговое окно.

Этап № 2

В открывшемся окне переходим по вкладкам C# → Веб. И выбираем опцию «Веб-приложение ASP.NET (.NET Framework)», а потом вводим нужные данные вашего проекта (название, каталог):

3-20219-eb9c40.png

В итоге должно открыться окно, где можно увидеть наш проект:

4-20219-ec3c6d.png

Этап № 3

Теперь нам надо создать файл будущего RESTful веб-сервиса. Для этого кликаем правой кнопкой по файлу проекта Webservice.REST (также можно нажать Ctrl+Shift+A) и выбираем опции Add->new item:

5-20219-390864.png 6-20219-ffa152.png

Откроется окно, где находим опцию «WCF Service (с поддержкой технологии AJAX)» и даём ей имя TutorialSevice.svc. После выбора этой опции Visual Studio создаст код, который станет основой для реализации web-сервиса. В нашем случае WCF (Windows Communication Foundation) — это библиотека, используемая для налаживания взаимодействия между приложениями посредством разных протоколов типа TCP, HTTP и HTTPS. Что касается AJAX, то эта технология позволяет асинхронно обновлять web-страницы и обмениваться небольшими объёмами данных с сервером.

7-20219-45434a.png

Этап № 4

Теперь надо внести изменения в Web.config. Это конфигурационный файл, который содержит настройки, нужные для правильной работы приложения. Таким образом, наше изменение позволит приложению отправлять и принимать данные как RESTful веб-сервис.

Открываем конфигурационный файл:

8-20219-0c9f38.png

В открывшемся файле находим строку <enableWebScript />:

9-20219-ba1278.png

и меняем её на <webHttp />:

10-20219-8ef550.png

Этап № 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 — это параметр, позволяющий GetAllTutorials() быть RESTful-методом, который можно вызвать GET-запросом.

Что касается самого метода GetAllTutorials(), то в нём есть код, собирающий все названия туториалов и возвращающий их в одной строке.

Этап № 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.

Реализует описанную логику метод GetTutorialByID(). Учтите, что мы приводим TutorialId к типу Integer. Связано это с тем, что всё, что передаётся адресную строку веб-браузера является строкой. А так как индексом списка строка быть не может, мы добавляем код, нужный для преобразования в число.

Этап № 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-запросе.

Что касается метода DeleteTutorial(), то в нём мы приводим переданный TutorialId к типу Integer, удаляя из списка соответствующий элемент.

В результате код должен выглядеть так (без учёта элементов, бывших там изначально):

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».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто