在拥有SQL Server数据库并希望移动应用能够与之交互时,需要一个API。使用微软的工具,通常意味着编写一个WebApi应用程序,使用C#语言,利用Linq和Entity Framework编写代码,并通过数据模型和仓库来构建应用程序。但本文将展示一种不同的方法:使用存储过程开发WebApi后端。
将使用一个名为apirIO的开源NuGet包来实现。REST是关于资源的,资源可以是一个对象,比如一个产品,或者是一个产品列表。HTTP用于通过GET、PUT、POST、DELETE等动词来操作资源。
以下是一些HTTP动词及其对应的URI和描述:
http://myserver/products
- 获取产品数组http://myserver/products/1
- 获取ID为1的产品http://myserver/products/1
- 使用正文中的值更新产品1http://myserver/products
- 添加产品http://myserver/products/99
- 删除产品使用SQL,开发存储过程来创建、读取、更新和删除产品。需要的HTTP动词是POST、GET、PUT、DELETE。按照约定,存储过程以API为前缀,然后是资源名称,然后是HTTP动词。对于示例产品资源,需要实现这些存储过程:
首先创建一个数据库,然后是产品示例表:
CREATE TABLE Products (
ProductID int IDENTITY(1,1) PRIMARY KEY,
ProductName varchar(100) NOT NULL
);
GO
INSERT INTO Products(ProductName) VALUES ('Widget 1');
GO
INSERT INTO Products(ProductName) VALUES ('Widget 2');
在GET存储过程中,返回一个或多个资源。此过程还定义了资源的结构:
CREATE PROCEDURE API_Products_Get (
@ID int = NULL
) AS
SELECT ProductId, ProductName
FROM Products
WHERE ProductID = @ID OR @ID IS NULL
更新存储过程将响应PUT HTTP动词。在这个例子中,希望能够更改产品的名称:
CREATE PROCEDURE API_Products_Put(
@ID int,
@ProductName VARCHAR(100)
) AS
UPDATE Products
SET ProductName = @ProductName
WHERE ProductID = @ID
POST存储过程可能很简单:
CREATE PROCEDURE API_Products_Post(
@ProductName VARCHAR(100),
@NewId int OUTPUT
) AS
INSERT INTO Products(ProductName)
VALUES (@ProductName)
SET @NewId = @@IDENTITY
RETURN 200
最后,删除存储过程可能很简单:
CREATE PROCEDURE API_Products_Delete(@ID int)
AS
DELETE FROM Products WHERE ProductID = @ID
有了这四个存储过程,就拥有了产品资源所需的所有代码。让使用Visual Studio 2015创建站点。使用标准的ASP.NET Web应用程序模板创建SqlWebApi。
当应用程序启动时,apirIO分析API*存储过程,并生成C#代码。生成的控制器继承自ASP.NET ApiControllers。代码在运行时编译并加载到项目中。C#源文件默认位于App_Data文件夹中。
C#开发人员多年来一直在使用XML注释来记录代码。这些注释被Visual Studio等工具以及Swashbuckle使用。ApirIO允许对存储过程进行注释,并将任何注释移动到生成的C#代码中。这对于API文档化非常有用,因为它可以在Swagger中使用,并且与数据库一起存在。
通过几个简单的存储过程,为产品表创建了一个REST Api。在生产中,应该创建一个API用户并限制访问权限,以便能够执行API*存储过程。生成的API获得了ASP.NET ApiController类的所有好处。不需要编写一行C#代码。创建的Asp.Net站点将适用于任何具有API_*存储过程的数据库。对于另一个Api项目,只需复制网站并更改连接字符串。