我一直渴望提出这个问题,但现在才找到时间.
无论如何,关于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架构的内容.
我很确定很多人会使用这个(请注意,我目前仍然使用很多)基于以下原因:
>它的工作原理.
>易于实施,维护和管理.
>进行数据库驱动开发的人员非常喜欢SQL命令,能够轻松地将我们在SQL编辑器中使用的SQL字符串轻松地应用到应用程序中,这是一个很大的松了一口气.当您可以使用上面的示例简单地实现所有多个查询(包括存储过程)时,为什么要使用ORM?
>大多数可用于数据相关应用程序的代码示例显示与上面相同的模式(数据集从Command对象填充,并作为DataSet或XML返回等).
为了让人们接受人们在这个编码领域中所称的“最佳实践”,人们应该说明为什么它更好,以及如何更容易地做这样的事情而不是经过尝试和测试的工作.
如果我可以请求我们的专家开发人员向我展示如何转换它,以及为什么转换为REST会更好(通过代码)的一些解释,那么我将非常感激.
感谢您的意见.谢谢.
额外:
我只想指出,虽然这是正确的,但在阅读本文之后,我开始怀疑这种方法是否是最好的:
http://www.codeproject.com/Feature/WeirdAndWonderful.aspx?msg=4324770#xx4324770xx
上面的文章,正如一篇评论所说 – “在网络服务中发现我正在升级.很难找到任何没有错的东西.”
我正试图建立一个真正的错误,因为我在一个绑定.
让我给你一些情况:
>客户/客户要求您提供查询存储在数据库中的信息的应用程序.
>您使用上述方法提出解决方案.提供客户要求的要求.该解决方案可靠,快速且可维护.
所以从本质上讲,我不得不问的另一个问题是,上面的代码到底是什么问题?
最佳答案 要转换它,虽然这不是我的头脑,它看起来像这样.
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正在进行客户端/服务器操作,并说,嘿,我们需要将所有内容都归功于PC.嗯,当它开始变得不那么受欢迎,因为部署是一场噩梦,他们意识到,哦,伙计,我们需要回到IBM一直在做的事情.大型服务器,愚蠢的客户端和简单的部署.但是,他们不能称之为,因为业界不会接受这一点而微软不希望这样,所以他们称之为云(在这里插入流浪汉,流浪汉,流浪音乐).
所以,快进到SOAP.人们希望能够通过线路传输复杂的对象,而不必反序列化它们,并且他们需要协议的灵活性.好吧,SOAP为您提供了两者,Microsoft生成客户端表示和反序列化,WCF层允许协议的真正灵活性,而ReST只能通过HTTP传输,因为它使用标准动词.
那么,你问题的真正答案是,你需要什么?
>对于非常大的数据集而言,SOAP比ReST更重且效率更低,因为它不是浏览器的本机操作,而且信封很大.但话又说回来,你真的应该将多少数据转移到客户端?!?
>您是否希望单击生成客户端模型?然后使用SOAP.
>您是否希望API更易于访问其他编程范例?然后使用ReST.
>您现在想要继续关注其他行业吗?然后使用ReST.
还有更多的讨论要做,但这应该让你开始. ReST并不比SOAP好,它有所不同,它解决了一系列不同的问题. Law of the instrument,不要让自己或其他人跟你说话.