Помощь в понимании веб-сервисов и REST

Я очень хотел задать этот вопрос, но нашел время только сейчас.

В любом случае, было много дискуссий о веб-сервисах (да, о тех традиционных сервисах ответа SOAP-XML) и сервисах RESTful (которые сейчас нужны многим разработчикам).

Я чувствую, что хотя я понимаю концепции REST в целом, мне нужно больше учиться. Я думаю, что лучший способ полностью охватить это - показать, что это действительно лучше (акцент на **, так как лучше это субъективное слово), чем то, что делалось в настоящее время.

Рассмотрим следующие простые традиционные коды: (Этот код скопирован из корпоративного приложения с Oracle в качестве бэкэнда. Я думаю, что база данных не будет иметь большого значения, поскольку вы можете легко переключаться между SQL Server, Oracle или любой другой БД в этом отношении).

myWebService.asmx.cs

namespace MyApplication
{
    public class myWebService : System.Web.Services.WebService
    {
        private classEmployee _emp = new classEmployee();

        [WebMethod]
        public string GetEmployees()
        {
            string EmployeeData = string.Empty;
            EmployeeData = _emp.GetEmployees();
            return EmployeeData;
        }
    }
}

classEmployee.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Data.OracleClient;

namespace MyApplication.App_Code
{
    public class classEmployee
    {
        private DataAccess _da;

        public string GetEmployees()
        {
            string employeeData = string.Empty;
            string cmd = string.Empty;
            OracleCommand oraCmd = new OracleCommand();
            DataSet ds = new DataSet();

            try
            {
                 cmd = "SELECT * FROM Employees";

                oraCmd.CommandType = CommandType.Text;
                oraCmd.CommandText = cmd;
                ds = (DataSet)_da.ExecSQLQueryCmd(oraCmd, DataAccess.ResultType.DataSet);
                employeeData = ds.GetXml
                ds.Dispose();
            }
            catch (Exception ex)
            {
                employeeData = "Error: " + "Getting Employees [GetEmployees]" + Environment.NewLine + "Details: " + Environment.NewLine + ex.Message;
            }

            return employeeData;
        }
    }
}

DataAccess.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.OracleClient;

namespace MyApplication.App_Code
{
    public class DataAccess
    {
        private OracleConnection oraConn;
        private String connString;

        public enum ResultType
        {
            DataReader = 0,
            DataSet = 1,
            DataTable = 2
        }

        public DataAccess()
        {
            connString = System.Configuration.ConfigurationManager.ConnectionStrings["AppConnectionString"].ConnectionString;
        }

        public object ExecuteSQLCommand(OracleCommand oraCommand, ResultType ReturnType, string TableName = "")
        {
            OracleDataAdapter oraDataAdapter = new OracleDataAdapter(oraCommand);
            oraConn = new OracleConnection(sConnectionString);

            try
            {
                oraConn.Open();
                oraCmd.Connection = oraConn;
                oraCmd.CommandType = CommandType.Text;

                switch (ReturnType)
                {
                    case ResultType.DataReader:
                        OracleDataReader oraDataReader = null;
                        oraDataReader = oraCmd.ExecuteReader();
                        return oraDataReader;

                    case ResultType.DataSet:
                        DataSet ds = new DataSet();
                        oDataAdapter.Fill(ds);
                        oraConn.Close();
                        oraConn.Dispose();
                        return ds;

                    case ResultType.DataTable:
                        DataTable dt = new DataTable();

                        if (!string.IsNullOrEmpty(TableName))
                            dt.TableName = TableName;
                        oDataAdapter.Fill(dt);
                        oraConn.Close();
                        oraConn.Dispose();
                        return dt;
                }
            }
            catch (OracleException oException)
            {
                throw oException;
            }
            finally
            {
                oDataAdapter.Dispose();
                oDataAdapter = null;
                oraCmd.Dispose();
            }

            return null;
        }

        public int ExecuteSQLNonQueryCommand(OracleCommand oraCommand)
        {
            // This will execute any NON-QUERY command.
            //Trimmed for Brevity purposes..
        }
    }
}

Приведенный выше код говорит сам за себя. Запустите веб-сервис и получите полученные данные в формате XML. Чтобы выполнить команды без запроса, просто замените командную строку, переданную в объекте команды, и вызовите необходимый метод в классе DataAccess.cs.

Я уже поражен различными мнениями о том, почему, по крайней мере, следует избегать вышеизложенного и вместо этого пойти на вызовы типа обслуживания RESTful. Но я не видел ничего, что, по крайней мере, помогло бы преобразовать этот код, чтобы хоть как-то охватить архитектуру RESTful.

Я вполне уверен, что многие люди используют это (заметьте, я до сих пор использую много этого в настоящее время) по той причине, что:

  1. Оно работает.
  2. Легко внедрить, поддерживать и управлять.
  3. Люди, которые занимаются разработкой на основе баз данных, настолько увлечены командами SQL, что возможность легко использовать те отбросы SQL, которые мы легко используем в редакторе SQL, для приложения - большой вздох облегчения. Зачем вам использовать ORM, если вы можете просто реализовать все несколько запросов (включая хранимые процедуры), используя приведенный выше пример.
  4. Большинство примеров кода, доступных для приложений, связанных с данными, показывают тот же шаблон, что и выше (набор данных заполняется из объекта Command и возвращается как DataSet или XML и т. Д.).

Чтобы принять то, что люди называют "Лучшей практикой" в этой области кодирования, нужно показать, почему это лучше, и как гораздо проще сделать такую ​​вещь по сравнению с той, которая была опробована и протестирована для работы.

Если бы я мог попросить наших коллег-опытных разработчиков показать мне, как преобразовать его, и дать некоторые объяснения, почему преобразование в REST было бы лучше (через код), то я был бы более чем благодарен за это.

Цените ваш вклад. Благодарю.

Дополнительно: я просто хочу отметить, что, хотя это правильно, у меня появились некоторые сомнения в том, что этот подход является лучшим после прочтения этой статьи:

http://www.codeproject.com/Feature/WeirdAndWonderful.aspx?msg=4324770

В статье выше, как прокомментировал один из них, говорилось: "Нашел это в веб-сервисе, который я обновляю. Трудно найти что-нибудь, что не так с этим".

Я пытаюсь также установить, что ДЕЙСТВИТЕЛЬНО не так с этим, поскольку я нахожусь в безвыходном положении.

Позвольте мне привести несколько ситуаций:

  1. Клиент / клиент просит вас предоставить приложение, которое запрашивает информацию, хранящуюся в базе данных.
  2. Вы придумали решение, используя вышеуказанный метод. Требования, задаваемые заказчиком, предоставляются. Решение надежное, быстрое и ремонтопригодное.

Итак, по сути, другой вопрос, который я долго задаю, - ЧТО на самом деле не так с кодом выше?

1 ответ

Решение

Чтобы преобразовать это, хотя это не в моей голове, это будет выглядеть примерно так.

namespace MyApplication 
{ 
    public class myWebService : System.Web.Services.WebService 
    { 
        private classEmployee _emp = new classEmployee(); 

        [HttpGet]
        public string GetEmployees() 
        { 
            string EmployeeData = string.Empty; 
            EmployeeData = _emp.GetEmployees(); 
            return EmployeeData; 
        } 
    } 
}

И вы можете вернуть эту строку во все, что легко конвертируется потребителем. Если это JavaScript, то я бы порекомендовал JSON, поскольку он нативный.

Давайте поговорим о ReST на минуту. Часть, которую я нахожу наиболее забавной ReST это старомодно ASMX услуги были ReSTful. Но, поскольку у ИТ-индустрии есть проблема с принятием того факта, что старые технологии, возможно, были более правильными с самого начала, им пришлось назвать это чем-то новым и новым.

Они сделали это с термином Client/Server также. IBM выполняла операции клиент-сервер за годы до того, как Microsoft пришла и сказала: "Эй, нам нужно перенести все на ПК. Что ж, когда это начало становиться все менее популярным, потому что развертывание было кошмаром, они поняли, о боже, нам нужно вернуться к тому, что IBM делала все это время. Большие серверы, тупые клиенты и простые развертывания. Но они не могли назвать это так, потому что индустрия не приняла бы это, и Microsoft не хотела этого, поэтому они назвали это The Cloud (вставьте бум, бум, бум музыку здесь).

Итак, перенесемся в SOAP. Люди хотели иметь возможность передавать сложные объекты по проводам и не должны десериализовать их, и они хотели гибкости протокола. Итак, SOAP дал вам обоим, Microsoft генерирует представление клиента и десериализацию, а уровень WCF обеспечивает реальную гибкость протокола, тогда как ReST может передаваться только по HTTP, потому что он использует стандартные глаголы.

Итак, настоящий ответ на ваш вопрос: что вам нужно?

  1. SOAP более тяжелый и часто менее производительный на очень больших наборах данных, чем ReST, потому что это не нативная операция для браузера, а конверт большой. Но опять же, сколько данных вы действительно должны передавать клиенту?!?
  2. Хотите ли вы генерацию одним кликом модели на стороне клиента? Тогда используйте SOAP.
  3. Хотите ли вы сделать API более доступным для других парадигм программирования? Тогда используйте ReST.
  4. Вы хотите пойти по пути остальной части отрасли в данный момент? Тогда используйте ReST.

Предстоит еще намного больше обсуждений, но это должно помочь вам начать. ReST не лучше, чем SOAP, он другой и решает другой набор проблем. Не позволяйте себе или другим говорить с вами о законе инструмента.

Другие вопросы по тегам