目录
介绍
数据库
设置我们的Azure Functions
创建我们的Azure Functions
创建模型
创建我们的主Function
连接到数据库
查询数据
检索和分配数据
发送结果
完整函数
测试Azure Functions
部署Azure Functions
在Azure中运行应用程序
结论
- GitHub 项目
在本文中,我们将使用SQLite作为后端编写一个带有Azure Functions的基本API。
我们将创建一个Web API,为您发送的邮政编码返回一个城市。这将是一个简单的小型服务,可用于表单和其他查找。
我们将使用预先填充的SQLite数据库并构建Azure Functions以与其交互并提供Web API接口。
SQLite是一个小型的、自包含的SQL数据库引擎,非常适合处理小数据。它是一个设计精良、性能卓越且可靠的数据库,您可能每天都在使用。由于其大小和资源使用情况,它在移动电话和其他便携式设备上无处不在。
你可以在此处了解有关Azure Functions的更多信息。
数据库该项目的数据库可在此处下载。这将是我们正在使用的数据库。
它是一个邮政编码及其相应城市的数据库。数据库的架构如下所示:
该数据库包含美国大部分城市的信息,以邮政编码为主键。
我们将在本地连接到该数据库,并将其与我们的Azure Functions一起打包和发送。
设置我们的Azure Functions我们需要在Azure中设置一个Azure Functions来部署我们的应用程序。这是该怎么做。
登录到您的Azure门户。搜索“功能应用”
单击“创建”。您将看到一个如下所示的对话框:
选择您的资源组,然后指定您的项目名称。这将是您的服务的域名。
选择“代码”进行发布,并选择.NET作为运行时堆栈。
选择版本3.1
以及你希望Azure Function所在的区域。
然后点击查看+创建
创建我们的Azure Functions打开Visual Studio 2019(或更高版本)并创建一个新项目。
搜索Azure Functions模板并单击下一步。
随意命名您的项目。我将我的命名为“ZiptoCity”。
确保选择:
- .NET Core 3 (LTS)
- Http触发器
- 匿名授权级别
并创建项目。
创建模型创建一个名为Models的新文件夹并创建一个名为City.cs的新类。这将是我们将作为结果返回的模型。
将以下属性添加到您的类中,使其看起来像这样:
using Newtonsoft.Json;
namespace ZiptoCity.Models
{
public class City
{
[JsonProperty("zipcode")]
public int ZipCode { get; set; }
[JsonProperty("cityname")]
public string CityName { get; set; }
[JsonProperty("county")]
public string County { get; set; }
[JsonProperty("state")]
public string State { get; set; }
[JsonProperty("timezone")]
public string TimeZone { get; set; }
}
}
这些是我们希望在API中公开的数据库部分。我们用JsonProperty装饰属性,因为它稍后会显示为JSON。
创建我们的主Function接下来我们将创建我们的函数来访问这些数据。
右键单击您的项目文件夹,然后选择添加 -> 新建 Azure Functions:
选择带有匿名身份验证的Http 触发器。
并添加新文件。
您将看到一个新功能。让我们做一些改变。
在自动生成方法的签名中,您将看到:
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)
将其更改为如下所示:
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "city/{id}")] HttpRequest req, ILogger log, int id)
我们将从可用的API方法中删除POST,因为我们没有使用它。
然后我们将添加一个以{id}作为参数的新路由。这是我们将添加邮政编码的地方。
最后,我们将使用int id捕获该id。
让我们更改日志消息:
log.LogInformation("Requested city for " + id);
现在我们将连接到数据库。
注意:对于较大的应用程序,最好将数据库连接信息抽象化。但是由于我们正在执行单个操作,因此我决定将所有连接处理放在该方法中。
连接到数据库现在我们要连接到我们的SQLite数据库。确保将此数据库复制到名为Data的文件夹中,并将数据库设置为Copy always。
然后我们需要安装SQLite Nuget包:
Install-Package System.Data.SQLite -Version 1.0.115
在我们的Run 法中,添加以下内容:
var sqlite_conn = new SQLiteConnection(@"Data Source=Data\zipcode.db; Version = 3; New = True; Compress = True; ");
try
{
sqlite_conn.Open();
}
catch (Exception ex)
{
log.LogInformation("Error: " + ex.Message);
}
此代码连接到位于Data文件夹中的SQLite数据库。如果我们在连接时遇到问题,它将被记录。
查询数据接下来我们将添加一些行来创建一个SQLiteDataReader和一个SQLiteCommand来填充数据。
SQLiteDataReader sqlite_datareader;
SQLiteCommand sqlite_cmd;
sqlite_cmd = sqlite_conn.CreateCommand();
现在,我们将创建一个查询来从我们想要返回的数据库中获取数据。我们将传入id作为查询的参数。
sqlite_cmd.CommandText = "SELECT zip, primaryCity, state, county, timezone FROM zip_code_database WHERE zip = '" + id + "'";
然后我们可以执行阅读器:
sqlite_datareader = sqlite_cmd.ExecuteReader();
现在我们要使用读取器来填充我们要返回的City对象。我们将创建一个对象来填充。
var resultCity = new City { };
我们还将创建一个可以在发送最终结果之前检查的bool:
var goodResult = false;
然后我们将创建一个循环,如果我们从查询中获得成功的结果,该循环将运行:
if (sqlite_datareader.HasRows)
{
goodResult = true;
while (sqlite_datareader.Read())
{
resultCity.ZipCode = sqlite_datareader.GetInt32(0);
resultCity.CityName = sqlite_datareader.GetString(1);
resultCity.State = sqlite_datareader.GetString(2);
resultCity.County = sqlite_datareader.GetString(3);
resultCity.TimeZone = sqlite_datareader.GetString(4);
}
}
在这个循环中,我们将goodResult设置为true。然后循环遍历数据读取器并将它的值分配给我们的resultCity对象。
现在我们可以关闭连接。
sqlite_conn.Close();
现在我们准备发送基于我们的查询的结果。如果我们没有从数据库中收到一个城市,goodResult将保持为false。
如果查询成功,我们将发送City对象的JSON表示:
if (goodResult)
{
return new OkObjectResult(resultCity);
}
else
{
return new NotFoundResult();
}
我们完成了!现在我们的Azure Functions可以测试了。
完整函数完整的函数应该是这样的:
[FunctionName("ZipCodeLookup")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "city/{id}")] HttpRequest req,
ILogger log, int id)
{
log.LogInformation("Requested city for " + id);
var sqlite_conn = new SQLiteConnection(@"Data Source=Data\zipcode.db; Version = 3; New = True; Compress = True; ");
try
{
sqlite_conn.Open();
}
catch (Exception ex)
{
log.LogInformation("Error: " + ex.Message);
}
SQLiteDataReader sqlite_datareader;
SQLiteCommand sqlite_cmd;
sqlite_cmd = sqlite_conn.CreateCommand();
sqlite_cmd.CommandText = "SELECT zip, primaryCity, state, county, timezone FROM zip_code_database WHERE zip = '" + id + "'";
sqlite_datareader = sqlite_cmd.ExecuteReader();
var resultCity = new City { };
var goodResult = false;
if (sqlite_datareader.HasRows)
{
goodResult = true;
while (sqlite_datareader.Read())
{
resultCity.ZipCode = sqlite_datareader.GetInt32(0);
resultCity.CityName = sqlite_datareader.GetString(1);
resultCity.State = sqlite_datareader.GetString(2);
resultCity.County = sqlite_datareader.GetString(3);
resultCity.TimeZone = sqlite_datareader.GetString(4);
}
}
sqlite_conn.Close();
if (goodResult)
{
return new OkObjectResult(resultCity);
}
else
{
return new NotFoundResult();
}
}
}
让我们来测试一下!
测试Azure Functions我们现在可以通过按5来测试我们的Azure Functions。您将看到一个控制台窗口,向您展示如何连接到它:
您可以在本地连接到您的函数,但使用URL+示例邮政编码:
现在我们知道它很好,我们可以部署它。
部署Azure Functions转到Build -> Publish并选择Azure。
选择Azure Function App (Windows)。
选择您的订阅、资源组,然后选择函数应用。确保未选中从包文件运行(推荐)。
按“完成”,然后按“发布”以部署到Azure。
在Azure中运行应用程序现在,应用程序已发布到 Azure,您必须进行一些快速更改,然后就可以使用了。
在Azure门户中,选择您的函数。然后向下滚动到CORS
在允许的来源中,添加通配符(*)字符。
注意:对于生产用途,您需要输入允许访问此应用程序的域名。
保存配置,您就可以开始了。
您现在可以使用浏览器或Postman向新API发送查询:
就是这样!
结论在这个项目中,我们构建了一个小型Web API,它接受邮政编码并返回城市信息。这是您可以在组织中使用的“微API”的一个很好的例子。小型、精简的应用程序一直很受欢迎,通过使用Azure Functions和SQLite,您可以制作性能良好且可扩展的小型应用程序。
微服务架构每天都变得越来越流行。构建松散耦合的小型服务和API可以帮助您的组织构建高性能且易于维护的应用程序。Azure Functions通过启用按使用量付费的小型空间来构建应用程序,从而使这成为可能。
你可以在此处了解有关Azure Functions的更多信息。
https://www.codeproject.com/Articles/5312004/Building-a-Micro-Web-API-with-Azure-Functions-and