您当前的位置: 首页 >  sql

寒冰屋

暂无认证

  • 2浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

寒冰屋 发布时间:2022-03-29 21:00:00 ,浏览量:2

目录

介绍

数据库

设置我们的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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0688s