云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

微软云_数据库外键的作用_新用户

小七 141 0

斯卡拉使用Scala和Play框架构建并保护api了解如何使用Scala和Play框架构建api,并使用访问令牌保护它们。

DR:在本文中,我们将使用Scala和Play框架来构建一个为博客文章和评论提供服务的API,然后使用访问令牌保护API。在本文的整个过程中,我们将从头开始构建API,但是如果您希望看到最终结果,可以在上找到示例代码GitHub.com网站.让我们使用Scala和Play框架构建一个API!这个API将相当简单。它将有两个端点——一个用于博客文章,一个用于评论——然后我们可以使用访问令牌来保护它们。也就是说,没有有效访问令牌的客户端将无法访问博客数据。我们将从构建API开始,然后稍后使用Auth0来发布访问令牌。然后,我们将验证这些令牌,并决定连接的客户端是否应该访问请求的资源。先决条件要继续阅读本文,您需要安装以下软件:使用Scala为Scala编译的项目合适的编辑器或IDE。我用IntelliJ的思想来构建这个教程。如果你想做同样的事情,他们有一个免费的社区版,而且还没有IDE注意IntelliJ需要安装Scala插件才能使用Scala项目。要安装插件,请阅读IntelliJ网站上的第一节"安装Scala插件"。如果您使用的是不同的IDE,如Eclipse或Netbeans,请检查是否需要为Scala开发安装任何插件。此外,您应该对Scala及其一些基本类型和控制流有基本的工作知识,因为我们在这里将不详细介绍它们。如果您是Scala新手,那么在返回完成本教程之前,最好先浏览一下Scala。建立项目首先,使用终端在硬盘上找到一个地方开始一个新的项目。我们将使用SBT和Giter8初始化我们的项目,这是从SBT控制台使用的模板化CLI,可以从GitHub加载项目模板。playframework有一组Giter8模板,我们可以使用这些模板在不使用IDE的情况下启动我们的项目。现在,使用以下命令在终端中搭建项目。作为运行此命令的一部分,将要求您输入项目名称。将使用此名称创建一个文件夹,您的项目代码将放在其中:sbt新playframework/play-scala-seed.g8您还将被要求提供组织名称。我把我的作为com.示例.接下来,在您选择的编辑器中打开项目,或者使用"导入"功能(如果您使用的是IntelliJ)。如果您可以选择使用哪个构建工具,请确保选择了"sbt"。在深入研究项目代码之前,我们将先清理一下默认项目并删除不需要的内容。您可以通过删除我们不打算使用的控制器、视图和公共资产来完成此操作:#删除未使用的文件夹rm-射频应用程序/控制器/家庭控制器.scala应用程序/视图公共测试#把路线清理干净,因为它们不会再编译了echo"">配置/路由现在你应该有一个漂亮、干净、空白的模板来构建我们的API。"学习如何使用scals构建安全的API框架"在推特上留言构建API我们将从启动并运行一个基本控制器开始,该控制器将承载我们的API端点。然后,在返回控制器并创建blog和comments端点之前,我们将创建一些特定于我们正在使用的域的模型。这样我们就可以逐步测试控制器的工作情况。启动API控制器首先,在app/controllers文件夹中创建一个名为ApiController.scala公司:触摸应用程序/控制器/ApiController.scala公司接下来,填充ApiController.scala公司包括以下内容://应用程序/控制器/ApiController.scala公司//确保它在"控制器"包中程序包控制器进口javax.注入{注入,单例}进口播放.api.mvc{AbstractController,ControllerComponents}@独生子女类ApiController@Inject()(cc:ControllerComponents)扩展AbstractController(cc){//现在创建一个简单的"ping"端点,以便//可以用一个基本的实现启动和运行def ping=操作{隐式请求=>好("你好,斯卡拉!")}}接下来,打开conf/routes文件并输入一个路由,该路由允许向ping端点发出请求:api/获取控制器.ApiController.ping有了这个基本实现,我们就可以运行这个项目,并向我们的简单ping端点发出请求。切换回终端并使用sbtcli启动项目。sbt运行9000注意:我选择在9000端口启动我的,但是你选择哪个端口号并不重要。另外,由于这是我们第一次运行此命令,下载所有依赖项可能需要几分钟时间。但是,在这个初始步骤之后运行项目应该快得多。要进行测试运行,请打开另一个终端窗口并使用curl命令向ping端点发出请求:卷曲本地主机:9000/api/ping如果一切正常,您应该看到"Hello,Scala!"出现在航站楼!如果您愿意,您可以让应用程序继续运行,因为SBT将接收文件更改并自动重新编译。添加模型和数据让我们添加一些类型和一个与我们的应用程序更相关的数据存储库—一个提供博客文章和评论的API。我们将添加:一个帖子模型,代表一篇博客文章一个评论模型,表示博客文章中的单个评论一个DataRepository类型,它静态地提供博客和评论,用于测试API首先在app中创建一个名为models的新文件夹,然后在其中创建一个名为models的新文件后scala:#您可以在终端中使用它来创建文件夹并添加文件mkdir应用程序/模型和触摸应用程序/模型/后scala然后,打开后scala并填充以下内容://应用程序/型号/后scala//一定要放在模型包里包装型号进口play.api.libs.json.json//将Post类型创建为标准case类case类Post(id:Int,content:String)对象后置{//我们将把这个类型作为JSON提供,所以指定一个//这里是Post类型的默认Json格式化程序隐式val格式=Json.format格式[帖子]}这里有一个case类来表示Post数据。为了简单起见,它只有两个属性:id和content。您将看到我们指定了一个JSON格式化程序。Play框架在将Post对象作为JSON发送回客户端时使用。它还可以从另一个角度将Post模型从JSON中解压出来。这很方便,因为我们不需要手动指定JSON的确切形状,我们可以使用这个内置的格式化程序,它根据模型上的属性和类型生成JSON。如果您想进一步了解JSON格式的工作原理,playframework有很好的JSON处理文档。现在我们已经实现了Post模型,我们可以用一种非常类似的方式实现我们的Comment模型。在app/models中创建一个名为评论.scala:触摸应用程序/型号/评论.scala下一步,打开评论.scala并填充以下内容://应用程序/型号/评论.scala包装型号进口play.api.libs.json.json//表示对博客文章的评论case类注释(id:Int,postId:Int,text:String,authorName:String)对象注释{//对注释类型使用默认的JSON格式化程序隐式val格式=Json.format格式[评论]}要完成我们的数据故事,请在中创建一个新的文件夹app/repositories和一个名为数据存储库.scala:mkdir应用程序/存储库和触摸应用程序/存储库/数据存储库.scala打开数据存储库.scala并添加以下内容://应用程序/存储库/数据存储库.scala包存储库进口javax.inject.Singleton导入模型。{Comment,Post}@独生子女类数据存储库{//为我们的API指定几个帖子私人val posts=序列(Post(1,"这是一篇博客文章"),帖子(2,"另一篇内容精彩的博客文章"))//为我们的API指定一些注释private val comments=序列("这是一篇很棒的博文(1),福克斯先生",评论(2,1,"感谢你的见解","简·杜"),评论(3,2,"太好了,谢谢你的帖子","乔·布洛格斯"))/**返回与指定id匹配的博客文章,如果没有,则返回无*找到了post(如果函数未定义,则collectFirst返回None*给定帖子id)*/def getPost(postId:Int):选项[Post]=posts.collectFirst{案例p如果p.id==postId=>p}/**返回博客文章的评论*如果指定的post id不存在注释,则返回空序列*因为我们用的是"托收"*/def getComments(postId:Int):Seq[Comment]=评论.收集{如果c.postId==postId=>c}}这是内存中数据存储的一个简单实现,我们的API可以使用它来向客户机返回一些有用的数据。重新访问我们的API控制器我们回去吧ApiController.scala公司文件并拉入我们刚刚创建的存储库。我们可以使用playframework的依赖注入特性来实现这一点。我们所要做的就是在控制器上指定DataRepository作为构造函数参数,Play将为我们创建存储库的实例并将其注入构造函数中。我们还将借此机会添加允许我们检索博客帖子和评论的方法。打开ApiController.scala公司并将其修改为如下所示://应用程序/控制器/ApiController.scala公司// ... 其他进口商品//新的JSON数据导入和存储库功能进口play.api.libs.json.json进口存储库.DataRepository@独生子女氯