您现在的位置:首页 > 新闻频道 > 数码电子 > 正文
用Scala实现简单的Web和API服务器

时间:2019-10-09 02:04:58    来源:本站    浏览次数:    新闻首页    我来说两句()

  Web和API服务器在互联网中的重要性,在计算机网络方面提供了最基本的界面。本文主要介绍了怎样利用Scala实现实时聊天网站和API服务器,通过本篇文章,你定将受益匪浅。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  Web和API服务器是互联网系统的骨干,它们为计算机通过网络交互提供了基本的界面,特别是在不同公司和组织之间。这篇指南将向你介绍如何利用Scala简单的HTTP服务器,来提供Web内容和API。本文还会介绍一个完整的例子,告诉你如何构建简单的实时聊天网站,同时支持HTML网页和JSON API端点。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  这篇文及章的目的是介绍怎样用Scala实现简单的HTTP服务器,从而提供网页服务,以响应API请求。我们会建立一个简单的聊天网站,可以让用户发表聊天信息,其他访问网站的用户都可以看见这些信息。为简单起见,我们将忽略认证、性能、用户挂历、数据库持久存储等问题。但是,这篇文章应该足够你开始用Scala构建网站和API服务器了,并为你学习并构建更多产品级项目打下基础。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  该命令将在后台运行Cask Web服务器,同时监视文件系统,如果文件发生了变化,则重启服务器。然后我们可以使用浏览器浏览服务器,默认网址是localhost:8080:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  第一件事就是将纯文本的Hello, World!转换成HTML网页。最简单的方式就是利用Scalatags这个HTML生成库。要在项目中使用Scalatags,只需将其作为依赖项加入到build.sc文件即可:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  我们应该可以看到./mill -w app.runBackground命令重新编译了代码并重启了服务器。然后刷新网页额,就会看到纯文本已经被替换成HTML页面了。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  为了让页面更好看一些,我们使用Bootstrap这个CSS框架。只需按照它的指南,使用link标签引入bootstrap:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  在本节的末尾,我们修改一下Scalatags的HTML模板,加上硬编码的聊天文本和假的输入框,让它看起来更像一个聊天应用程序。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  现在我们有了一个简单的静态网站,其利用Cask web框架和Scalatags HTML库提供HTML网页服务。现在的服务器代码如下所示:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  为网站添加交互的第一次尝试是使用HTML表单。首先我们要删掉硬编码的消息列表,转而根据数据来输出HTML网页:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  这里我们简单地使用了内存上的mssages存储。关于如何将消息持久存储到数据库中,我将在以后的文章中介绍。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  接下来,我们需要让页面底部的两个input支持交互。为实现这一点,我们需要将它们包裹在form元素中:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  这样我们就有了一个可以交互的表单,外观跟之前的差不多。但是,提交表单会导致Error 404: Not Found错误。这是因为我们还没有将表单与服务器连接起来,来处理表单提交并获取新的聊天信息。我们可以这样做:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  @cast.postForm定义为根URL(即 / )添加了另一个处理函数,但该处理函数处理POST请求,而不处理GET请求。Cask文档()中还有关于@cask.*注释的其他例子,你可以利用它们来定义处理函数。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  现在,用户能够以任何名字提交任何评论。但是,并非所有的评论和名字都是有效的:最低限度,我们希望保证评论和名字字段非空,同时我们还需要限制最大长度。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  这样就可以阻止用户输入非法的name和msg,但出现了另一个问题:用户输入了非法的名字或信息并提交,那么这些信息就会消失,而且不会为错误产生任何反馈。解决方法是,给hello页面渲染一个可选的错误信息,用它来告诉用户出现了什么问题:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  现在比较烦人的是,每次向聊天室中输入消息时,都要重新输入用户名。此外,如果用户名或信息非法,那消息就会被清除,只能重新输入并提交。可以让hello页面处理函数来填充这些字段,这样就可以解决:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  这里我们使用了可选的userName和msg查询参数,如果它们存在,则将其作为HTML input标签的value的默认值。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  接下来在postHello的处理函数中渲染页面时,填充userName和msg,再发送给用户:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  注意任何情况下我们都保留name,但只有错误的情况才保留msg。这样做是正确的,因为我们只希望用户在出错时才进行编辑并重新提交。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  现在有了一个简单的、基于表单的聊天网站,用户可以发表消息,其他用户加载页面即可看到已发表的消息。下一步就是让网站变成动态的,这样用户不需要刷新页面就能发表消息了。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  要想只渲染需要更新的那部分页面,我们可以重构下代码,从hello页面处理函数中提取出messageList辅助函数:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  接下来,我们可以修改postHello处理函数,从而仅渲染可能发生了变化的messageList,而不是渲染整个页面:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  现在我们写好了服务器端代码,接下来我们编写相关的客户端代码,从服务器接收JSON响应,并利用它来更新HTML界面jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  这样就可以了。现在向网站添加聊天文本,文本就会立即出现在网页上,之后加载页面的其他人也能看见。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  注意尽管你输入的消息你自己可以立即看到,但其他人只有刷新页面,或者输入自己的消息迫使messageList重新加载,才能看到你的消息。本文的最后一节将介绍怎样让所有人立即看到你的消息,而不需要手动刷新。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  推送更新的概念和简单:每次提交新消息后,就将消息”推送到所有中的浏览器上,而不是等待浏览器刷新并“拉取”更新后的数据。实现这一目的有多种方法。本文我们使用Websockets。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  Websockets可以让浏览器和服务器在正常的HTTP请求-响应流之外互相发送消息。连接一旦建立,任何一方都可以在任何时间发送消息,消息可以包含任意字符串或任意字节。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  该处理函数接收来自浏览器的msg,检查其内容是否应该立即响应,还是应该利用openConnections注册一个连接再稍后响应。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  最后,我们需要在浏览器的标签中添加一点Java代码,来打开Websocket连接,并处理消息的交换:jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  这里,我们首先打开一个连接,发送第一条0消息来启动整个流程,然后每次收到更新后,就将json.txt渲染到messageList中,然后将json.index发送回服务器,来订阅下一次更新。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  本文我们介绍了怎样利用Scala实现实时聊天网站和API服务器。我们从静态网站开始,添加基于表单的交互,再利用Ajax访问JSON API实现动态页面,最后利用websocket实现推送通知。我们使用了Cask web框架,Scalatags HTML库,以及uJson序列化库,代码大约125行。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

  这里展示的聊天网站非常简单。我们故意忽略了将消息保存到持久数据库、认证、用户账号、多聊天室、使用量限制以及许多其他的功能。这里仅使用了内存上的messages列表和openConnections集合,从并发更新的角度来看,它们并非线程安全的。但无论如何,希望这篇文章能够让你体会到怎样使用Scala实现简单的网站和API服务器,进而用它构建更大、更宏伟的应用程序。jnp零点资讯网_新闻资讯门户|新闻|中国新闻|2018香港今晚六会彩开奖结|中国新闻网

分享到: 更多
相关阅读:
网友评论:
用户:
 密码:
 验证码: 
 匿名发表
如果你对新闻频道有任何意见或建议,请到交流平台反馈。
企业服务
推广信息
点击排行