使用Azure Functions和SQLite构建微型Web API

目录

介绍

数据库

设置我们的Azure Functions

创建我们的Azure Functions

创建模型

创建我们的主Function

连接到数据库

查询数据

检索和分配数据

发送结果

完整函数

测试Azure Functions

部署Azure Functions

在Azure中运行应用程序

结论


介绍

在本文中,我们将使用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<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)

将其更改为如下所示:

public static async Task<IActionResult> 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<IActionResult> 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 FunctionsSQLite,您可以制作性能良好且可扩展的小型应用程序。

微服务架构每天都变得越来越流行。构建松散耦合的小型服务和API可以帮助您的组织构建高性能且易于维护的应用程序。Azure Functions通过启用按使用量付费的小型空间来构建应用程序,从而使这成为可能。

你可以在此处了解有关Azure Functions的更多信息

https://www.codeproject.com/Articles/5312004/Building-a-Micro-Web-API-with-Azure-Functions-and

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值