我一直渴望提出这个问题,但现在才找到时间。
无论如何,关于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架构的内容。
我很确定很多人会使用这个(请注意,我目前仍然使用很多)基于以下原因:
对于一个接受人们称之为“最佳实践”的人来说,在这个编码领域,人们应该说明为什么它更好,以及如何更容易地做这样的事情而不是经过尝试和测试工作的那个
如果我可以请求我们的专家开发人员向我展示如何转换它,以及为什么转换为REST会更好(通过代码)的一些解释,那么我将非常感激。
感谢您的输入。感谢。
其他: 我只想指出,虽然这是正确的,但在阅读本文后,我开始怀疑这种方法是否最好:
http://www.codeproject.com/Feature/WeirdAndWonderful.aspx?msg=4324770#xx4324770xx
上面的文章,如评论所述 - “在网络服务中发现我正在升级。很难找到任何没有错的。”
我正在尝试建立一个真正错误的东西,因为我处于绑定状态。
让我告诉你一些情况:
所以从本质上讲,我不得不问的另一个问题是,上面的代码出了什么问题?
答案 0 :(得分: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正在进行客户端/服务器运营,并表示,我们需要将所有 down 带到PC上。好吧,当它开始变得不那么受欢迎,因为部署是一个噩梦他们意识到,哦,伙计,我们需要回到IBM一直在做的事情。大型服务器,愚蠢的客户端和简单的部署。但是,他们不能称之为,因为该行业不会接受,微软不希望这样,所以他们称之为The Cloud
(在这里插入流浪汉,流浪汉,流浪汉音乐)
所以,快进SOAP。人们希望能够通过线路传输复杂的对象,不必须反序列化和他们需要协议的灵活性。好吧,SOAP给你们两个,微软生成客户端表示和反序列化和 WCF层允许协议的真正灵活性,而ReST只能 通过HTTP传输,因为它使用了标准动词。
所以,你问题的真正答案是,你需要什么?
还有更多的讨论要做,但这应该让你开始。 ReST不比SOAP强更好,它有所不同,它解决了一系列不同的问题。 不要让自己或其他人跟你说Law of the instrument。