在 .NET Core 中构建一个根据邮政编码获取城市名称的服务
我希望大家对我的内容提出诚实的反馈。请评论或在 Twitter 上联系我!
你见过那种根据邮政编码显示城市信息的下拉菜单吗?这是一个小巧却简洁的用户界面元素,可以方便地让用户输入表单更简洁、更快捷。
我们将构建什么
我们将构建一个应用程序,以邮政编码作为输入,并返回该邮政编码的城市信息,如下所示:
它将是一个 .NET Core Web API 应用程序,可用于网页、移动设备等各种平台。它有点像微服务,但我不太喜欢这么叫。它是一个简单的RESTful应用程序。
入门所需
在本教程中,我使用的是 .NET Core 2.2。您需要从此处下载 .NET Core 安装程序。您可以使用文本编辑器和 CLI 轻松完成此项目,但在本教程中,我使用Visual Studio来展示它的易用性。
您还应该下载DB Browser以将数据导入 SQLite 数据库。
步骤1:创建一个新项目。
加载 Visual Studio 并创建一个新项目。
选择“ASP.NET Core Web 应用程序”,然后点击“下一步”。项目名称可随意命名。
接下来,您将看到如下所示的屏幕。选择“API”并点击“创建”。
这将搭建一个新的 API 应用程序。我们要做的第一件事是删除“values”控制器。
然后,我们将安装一些工具,以便我们可以在此应用程序中使用 SQLite 和 Entity Framework Core:
在命令提示符或程序包管理器控制台中,运行以下命令:
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design
这将添加 SQLite 支持和设计命名空间,其中有一些可以帮助我们的设计组件。
我们在这里使用 SQLite 的原因是,我们希望它成为一个无需服务器的独立数据库,并且能够在三个平台上运行。SQLite 可以很好地满足这一需求,至少对于像这样的小型数据库来说是如此。
不要忘记恢复项目:
dotnet restore
注意:这里完全不需要 EF Core。直接访问或使用Dapper之类的工具可能会更快。但为了简单起见,我们使用 EF Core。
2.创建模型
接下来,创建一个名为 models 的文件夹,并创建一个新类。我们的类将如下所示:
public class City
{
[Key]
public string Zip { get; set; }
public float Lat { get; set; }
public float Lng { get; set; }
public string CityName { get; set; }
public string StateId { get; set; }
public string StateName { get; set; }
public string TimeZone { get; set; }
public ICollection<City> Cities { get; set; }
}
这个类代表“城市”,也就是我们要处理的数据类型。如你所见,它包含邮政编码,我们将在这里使用它作为 ID。它包含城市的经纬度、名称、州 ID(例如 OR)、州名和时区。
我们还将在此处添加一个“城市”集合,以返回城市集合。保存文件。
3. 定义上下文
接下来,我们将为这些城市可以居住的数据库创建一个上下文。在模型中创建一个如下所示的新类:
public class CityContext : DbContext
{
public CityContext(DbContextOptions<CityContext> options) : base(options){ }
public DbSet<City> Cities { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(@"Data Source=Database/zipcodes.db"); // windows
}
}
这是我们将用于 Entity Framework Core 的上下文,以便我们可以轻松地操作数据。
这里我们允许将选项注入到类中,并在配置时用 optionsbuilder 覆盖它。这里会指示上下文使用特定文件,在本例中是zipcodes.db。这将是包含我们城市信息的托管数据库。
接下来,打开startup.cs并将以下几行添加到顶部:
using Microsoft.EntityFrameworkCore;
using Zippy.Models;
确保第二行是模型命名空间的路径(我的项目名为 Zippy)。
然后在Configureservices方法中,我们将再次添加对数据库的引用,并设置EF选项以使用SQLite。
var connection = @"Data Source=Database\zipcodes.db"; // Windows
services.AddDbContext<CityContext>(options => options.UseSqlite(connection));
注意注释掉的地方,写着“Windows”。如果你想在 Linux 或 OSX 系统上运行这个程序,你需要把斜杠反过来,这样才能在文件系统中找到它:
var connection = @"Data Source=Database/zipcodes.db"; // Linux
现在让我们创建该数据库。
4.创建数据库
在项目中创建一个名为“数据库”的新文件夹。
打开数据库浏览器并创建一个新的数据库。
创建一个文件名来保存它。目前您无需创建任何表格或执行任何其他操作。
5.创建迁移
我们的数据库中只有一个表,但我们想在 EF Core 中为其创建一个迁移。迁移对于跟踪数据库的历史更改以及在需要时恢复数据非常重要。注意,这里我仅讨论架构(布局)信息,而不是存储在其中的数据。
dotnet ef migrations add Initial
现在我们已经完成了初始架构的设置。接下来更新 Entity Framework Core:
dotnet ef database update
现在我们的数据库和表已经创建。
6.导入数据
这将使用来自Simple Maps的 CSV 数据进行填充。如果您打算将其用于网站,请务必提供指向其网站的链接,以表彰其贡献。
现在表格已创建完毕,我们将使用从“简单地图”下载的 CSV 文件中的数据填充表格。在本项目中,我删除了一些列,如下所示:
正如Derek指出的那样,您需要在末尾添加一个空白字段,以便它与 EF 生成的表中的列相匹配。
现在可以导入了。
转到文件 -> 导入 -> 来自 CSV 文件的表格:
加载你之前创建的 CSV 文件。它应该如下所示:
然后导入文件。现在您应该有一个完整的数据库。
保存数据库文件。确保将其设置为与项目一起复制。
现在让我们让我们的应用程序与它进行交互。
7.创建控制器
现在我们需要创建一个城市控制器。这个过程相当简单,但 Visual Studio 让它变得更加简单。
右键单击控制器文件夹并选择添加->控制器
我们希望使用实体框架选择一个具有操作的 API 控制器
模型类选择City ,数据上下文类选择CityContext并生成。
Visual Studio 将自动生成一组操作来执行以下操作:
- 获取数据库中的城市列表
- 从邮政编码获取特定城市
- 添加城市
- 删除城市
- 更新信息
虽然这些功能构建起来相当简单,但最好能搭建好。为了使其成为一个可用的服务,您需要删除修改数据的操作,只保留 GET 功能。
8.设置默认路由
最后一步是设置默认路由。打开launchSettings.json 文件,修改标有“launchUrl”的两行:
改变
"launchUrl": "api/values",
到
"launchUrl": "api/cities",
保存文件并构建项目。按 F5 启动它。
成品
按下 F5 后,您将看到该项目出现在您的网络浏览器中。
为了使此服务按预期工作,它必须将邮政编码作为输入,这可以通过将邮政编码附加到 URL 末尾轻松完成:
当使用 POSTMan 之类的格式时,看起来会更好:
您可以通过多种方式将此服务用于表单中的用户界面。这可以通过 JavaScript 应用程序或移动应用轻松调用。
结论
使用 .NET Core 创建简单的微服务和应用程序非常简单。它们可以快速组合,运行速度极快且精简。此外,它们可以在任何平台上运行。如果您想了解更多关于 .NET Core 的信息,可以查看这些精彩的课程,或访问微软的.NET Core 帮助网站。
在未来的教程中,我将向您展示如何将此应用程序部署到多个服务器和云环境。
注意:此应用使用Simple Maps(免费版)的数据。如果您打算在自己的网站上使用此应用,请提供链接或考虑使用专业版,因为专业版的数据更准确、更新更快。
你的 .NET Core IQ 是多少?
我的 ASP.NET Core 技能智商是 200。还不错,你能超越吗?点击此处尝试
文章来源:https://dev.to/pluralsight/building-a-service-to-get-a-city-name-from-a-zip-code-in-net-core-3ld5