2018-11-14 16:01

 版权声明:本文为博主原创文章,未经博主允许不得转载。

  我们讲讲rust,rust是C语言或C++实现的目标,静态语言。我们将创建一个rust仅处理用户注册和身份验证的Web服务器。我将在逐步解释每个文件中的步骤。完整的项目代码在这里。

  事件的流程如下所示:

  使用电子邮件地址注册➡接收带有链接的进行验证

  点击链接➡使相同的电子邮件和密码注册

  使用电子邮件和密码登录➡获取验证并接收jwt令牌

  我们打算使用的包

  actix     // Actix是一个Rust actor框架

  actix-web   // Actix web是Rust的一个简单,实用且极其快速的Web框架

  brcypt     //使用bcrypt轻松散列和验证密码。

  chrono     // Rust的日期和时间库。

  diesel     //用于PostgreSQL,SQLite和MySQL的安全,可扩展的ORM和查询生成器。

  dotenv     // Rust的dotenv实现。

  env_logger   //通过环境变量配置的日志记录实现。

  failure     //实验性错误处理抽象。

  jsonwebtoken   //以强类型方式创建和解析JWT。

  futures     //future和Stream的实现,具有零分配,可组合性和类似迭代器的接口。

  r2d2      //通用连接池。

  serde     //通用序列化/反序列化框架。

  serde_json   // JSON序列化文件格式。

  serde_derive   //#[derive(Serialize,Deserialize)]的宏1.1实现。

  sparkpost   //用于sparkpost电子邮件api v1的Rust绑定。

  uuid     //用于生成和解析UUID的库。

  我从他们的官方说明中提供了有关正在使用的包的简要信息。如果您想了解更多有关这些板条箱的信息,请转到crates.io。

  准备

  我将在这里假设您对编程有一些了解,最好还有一些Rust。需要进行工作设置rust。查看https://rustup.rs用于rust设置。

  我们将使用diesel来创建模型并处理数据库,查询和迁移。请前往http://diesel.rs/guides/getting-started/开始使用并进行设置diesel_cli。在本教程中我们将使用postgresql,请按照说明设置postgres。您需要有一个正在运行的postgres服务器,并且可以创建一个数据库来完成本教程。另一个很好的工具是Cargo Watch,它允许您在进行任何更改时观看文件系统并重新编译并重新运行应用程序。

  如果您的系统上已经没有安装Curl,请在本地测试api。

  让我们开始

  检查你的rust和cargo版本并创建一个新的项目

  1542181014529028.png

  用以下内容填写cargo依赖关系,我将在项目中使用它们。我正在使用crate的显式版本,因为你知道包变旧了并且发生了变化。(如果你在很长一段时间之后阅读本教程)。在本教程的第1部分中,我们不会使用所有这些,但它们在最终的应用程序中都会变得很方便。

  1542181084638696.png

  设置基本APP

  创建新文件src/models.rs与src/app.rs。

  1542181190554480.png

  要使用此Actor,我们需要设置actix-web服务器。我们有以下内容src/app.rs。我们暂时将资源构建者留空。这就是路由的核心所在。

  1542181292985341.png

  // main.rs

  1542181627702796.png

       1542181648459927.png

  在此阶段,您的服务器应该编译并运行127.0.0.1:3000。让我们创建一些模型。

  设置diesel并创建我们的用户模型

  我们首先为用户创建模型。假设您已经完成postgres并diesel-cli安装并正常工作。在您的终端中echo DATABASE_URL=postgres://username:password@localhost/database_name > .env,在设置时替换database_name,username和password。然后我们在终端跑diesel setup。这将创建我们的数据库并设置迁移目录等。

  我们来写一些吧SQL。通过diesel migration generate users和创建迁移diesel migration generate invitations。在migrations文件夹中打开up.sql和down.sql文件,并分别添加以下sql。

  1542181708956646.png

  在您的终端中 diesel migration run将在DB和src/schema.rs文件中创建表。这将进行diesel和migrations。请阅读他们的文档以了解更多信息。

  在这个阶段,我们已经在db中创建了表,让我们编写一些代码来创建users和invitations的表示。在models.rs我们添加以下内容。

  1542181824970619.png

  检查您的实现是否没有错误/警告,并密切关注终端中的cargo watch -x run命令。

  我们自己的错误响应类型

  在我们开始为应用程序的各种路由实现处理程序之前,我们首先设置一般错误响应。它不是强制性要求,但随着您的应用程序的增长,将来可能会有用。

  Actix-web提供与failure库的自动兼容性,以便错误导出失败将自动转换为actix错误。请记住,这些错误将使用默认的500状态代码呈现,除非您还为它们提供了自己的error_response()实现。

  这将允许我们使用自定义消息发送http错误响应。创建errors.rs包含以下内容的文章。

       1542181915710345.png

  不要忘记添加mod errors;到您的main.rs文件中以便能够使用自定义错误消息。

  实现handler处理程序

  我们希望我们的服务器从客户端收到一封电子邮件,并在数据库中的invitations表中创建。在此实现中,我们将向用户发送电子邮件。如果您没有设置电子邮件服务,则可以忽略电子邮件功能,只需使用服务器上的响应数据。

  从actix文档:

  Actor通过发送消息与其他actor通信。在actix中,所有消息具有类型。消息可以是实现Message trait的任何Rust类型。

  并且

  请求处理程序可以是实现Handler trait的任何对象。请求处理分两个阶段进行。首先调用handler对象,返回实现Responder trait的任何对象。然后,在返回的对象上调用respond_to(),将自身转换为AsyncResult或Error。

  让我们实现Handler这样的请求。首先创建一个新文件src/invitation_handler.rs并在其中创建以下结构。

  

  不要忘记在main.rs文件中添加mod invitation_handler。

  现在我们有一个处理程序来插入和返回DB的invitations。使用以下内容创建另一个文件。register_email()接收CreateInvitation结构和保存DB地址的状态。我们通过调用into_inner()发送实际的signup_invitation结构。此函数以异步方式返回invitations或我们的Handler处理程序中定义的错误.

  1542182218586217.png

  测试你的服务器

  你应该能够使用以下curl命令测试http://localhost:3000/invitation路由。

  1542182305371927.png

  rust在互联网项目中的应用越来越广泛,会用只是学习rust中最简单的一步,要想真正的成为rust高手,了解其底层的实现必不可少。本篇文章详细介绍,使用Actix-Web验证过程,对开发C语言运用有很大好处。今次课文讲到这边了,待续...

      原文出处: krircc

 版权声明:本文为博主原创文章,未经博主允许不得转载。

评论

kvc636757024

#1

kvc636757024

http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E7%94%B5%E8%AF%9D_18183615678
2020/06/26 13:59回复