帮助理解Web服务和REST



我一直很想问这个问题,但现在才抽出时间。

无论如何,已经有很多关于Web服务(是的,那些传统的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..
        }
    }
}

上面的代码是不言自明的。调用web服务并获取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#xx4324770xx

上面的文章,正如一位评论所说的那样-"在我正在升级的网络服务中发现了这个。很难找到任何没有问题的东西。"

当我陷入困境时,我也在努力确定这件事到底出了什么问题。

让我给你一些情况:

  1. 客户要求您提供一个应用程序来查询存储在数据库中的信息
  2. 您使用上述方法得出了解决方案。提供客户提出的要求。该解决方案可靠、快速且可维护

所以本质上,我想问的另一个问题是,上面的代码到底出了什么问题?

要转换它,尽管这不是我的想法,但它看起来是这样的。

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。但是,由于IT行业在接受一个旧技术可能一直都更正确的事实方面存在问题,他们不得不将其命名为新鲜和新的技术。

他们用术语Client/Server也做到了这一点。在微软过来说嘿,我们需要把所有的东西都放到电脑上之前,IBM就已经在做客户机/服务器操作了。好吧,当这开始变得不那么流行时,因为部署是一场噩梦他们意识到,哦,天哪,我们需要回到IBM一直在做的事情上来。大型服务器、愚蠢的客户端和简单的部署。但是,他们不能这么称呼它,因为这个行业不会接受这一点,而微软也不希望这样,所以他们称之为The Cloud(在这里插入流浪、流浪、流浪音乐)

所以,快进到SOAP。人们希望能够通过有线传输复杂的对象,而而不是必须对它们进行反序列化他们希望协议的灵活性。好吧,SOAP为您提供了两者,Microsoft生成客户端表示和反序列化WCF层允许协议的真正灵活性,而ReST只能通过HTTP传输,因为它使用标准谓词。

所以,你的问题的真正答案是,你需要什么?

  1. SOAP比ReST更重,在非常大的数据集上的性能通常更低,因为它不是浏览器的本机操作信封很大。但话说回来,你到底应该向客户端传输多少数据
  2. 您想要一键生成客户端模型吗?然后使用SOAP
  3. 您想让API更容易被其他编程范例访问吗?然后使用ReST
  4. 你现在想走行业其他人的路吗?然后使用ReST

还有很多讨论要进行,但这应该会让你开始。ReST并不比SOAP好,它不同,它解决了一组不同的问题不要让自己或他人说服你遵守工具定律。

相关内容

  • 没有找到相关文章

最新更新