在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RESTful API。

模块

首先让我们了解一下“模块”的概念。Raspkate的模块包含了一组能够提供完整业务功能的HTTP处理器(Handler),例如,在Raspkate的源代码库中,默认提供了两个模块:Default和RaspberryPi,它们分别位于两个不同的C#项目中:

  • Raspkate.Modules.Default
  • Raspkate.Modules.RaspberryPi

Default模块包含了一个标准的静态文件访问服务/处理器,以及一个能够读取并返回服务器信息的RESTful API控制器;而RaspberryPi模块则提供了一个访问树莓派信息页静态文件的处理器,以及一个读取树莓派信息的RESTful API控制器。当然,在这里静态文件访问处理都是由FileHandler负责,而RESTful API的处理则由ControllerHandler完成。虽然这两个模块使用了相同类型的Handler,但它们所专注的业务功能完全不同,而且它们是相互隔离,独立执行的。

Raspkate中每个模块都被存放于modules目录下的某个子目录中,在Raspkate服务启动时,会扫描modules目录下的所有程序集,定位所有继承于RaspkateModule类的子类,并根据类型定义对Handler进行初始化然后注册到Raspkate服务中,以便这些Handler能够为HTTP请求提供服务。当然,这些模块也可以放在其它目录下,但这就需要修改Raspkate服务的配置文件RaspkateService.exe.config,把模块所在的目录添加到modules节点下,例如:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="raspkateConfiguration" type="Raspkate.Config.RaspkateConfiguration, Raspkate"/>
</configSections> <raspkateConfiguration xmlns="urn:Raspkate.Config" prefix="http://127.0.0.1:9023/">
<modules>
<add path="modules"/>
<add path="d:\\test" relative="false" />
</modules>
</raspkateConfiguration> </configuration>

在模块的注册类型中(也就是继承于RaspkateModule类的子类中),只需要返回该模块能够提供的Handler实例即可。接下来,让我们一起看看,如何开发一个自己的模块,并通过注册ControllerHandler,向调用者提供RESTful API服务。

案例:计算器

最简单的不过就是计算器运算:加、减、乘、除。那么最最简单的就是计算两个整数的和,好吧,就以这个为例,开始我们的RESTful API开发之旅。

首先,打开Visual Studio 2013,新建一个C#类库(Class Library)项目,项目命名为RaspkateCalculatorModule,注意.NET Framework至少选择4.5.2以上(老版本的Framework除了2.0以外,Microsoft都不再官方支持了)。成功创建项目后,添加对Raspkate.dll的引用。

然后,在这个项目中新建一个名为CalculatorController的类,代码如下:

[RoutePrefix("calc")]
public class CalculatorController : RaspkateController
{
[HttpGet]
[Route("add/{a}/{b}")]
public int Add(int a, int b)
{
return a + b;
}
}

接着,在这个项目中新建一个名为Module的类,代码如下:

internal sealed class Module : RaspkateModule
{
public Module(ModuleContext context)
: base(context)
{ } protected override IEnumerable<IRaspkateHandler> CreateHandlers()
{
yield return new ControllerHandler("CalculatorController",
new [] { typeof(CalculatorController) });
}
}

OK,万事俱备,只欠东风啦!回到Raspkate中,将RaspkateService.exe.config稍微改动一下,将该模块的输出目录添加到modules节点中,即可直接启动RaspkateService.exe程序了:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="raspkateConfiguration" type="Raspkate.Config.RaspkateConfiguration, Raspkate"/>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections> <raspkateConfiguration xmlns="urn:Raspkate.Config" prefix="http://127.0.0.1:9023/">
<modules>
<add path="modules"/>
<add path="C:\Users\chenqn\Documents\visual studio 2013\Projects\RaspkateCalculatorModule\RaspkateCalculatorModule\bin\Debug" relative="false"/>
</modules>
</raspkateConfiguration> <log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%utcdate{DATE} [%thread] %level %logger - %message%newline"/>
</layout>
</appender>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logs/raspkate.log" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="FileAppender" />
</root>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>

启动程序后,你可以在输出的日志中注意到,CalculatorController已经被注册到ControllerHandler当中,进而可以开始提供HTTP请求的服务了:

请打开你的浏览器,在地址栏中输入:

http://127.0.0.1:9023/calc/add/12/30

那么,你应该看到的是:

看来Raspkate服务已经将计算结果返回给你了。怎么样?使用Raspkate开发RESTful API是不是非常快捷?接下来让我们看看更加有意思的特性。

案例:计算器(进阶)

刚才我们的计算器还是太简单,接下来我打算让这个计算器能够计算复数(包括虚数部分)的乘法。同学们是否还记得复数相乘的计算公式?

OK,也就是我们的RESTful API需要接收两个复数,每个复数都要包含实数 r 和虚数 i 两个部分,返回值也应该包含实数和虚数两个部分。那么,我们的CalculatorController就可以写成这样:

[RoutePrefix("calc")]
public class CalculatorController : RaspkateController
{
[HttpGet]
[Route("add/{a}/{b}")]
public int Add(int a, int b)
{
return a + b;
} [HttpPost]
[Route("mul")]
public dynamic Multiplicity([FromBody] dynamic input)
{
var a = input.x.r; // 第一个数的实数部分
var b = input.x.i; // 第一个数的虚数部分
var c = input.y.r; // 第二个数的实数部分
var d = input.y.i; // 第二个数的虚数部分
return new { z = new { r = a * c - b * d, i = b * c + a * d } };
}
}

重新运行Raspkate服务,打开能够发出HttpPost请求的测试客户端(我用的是Fiddler),看看我们的程序是否可以正确执行:

测试成功,RESTful API已经以JSON格式返回了我们需要的计算结果。

总结

从上面的演示可以看到,Raspkate服务中RESTful API的实现,沿用了类似微软ASP.NET Web API的编程习惯,包括:

  • Controller的编程模型(ASP.NET Web API中使用ApiController作为基类,此处使用RaspkateController作为基类)
  • Attribute Routing
  • HttpGet和HttpPost两种HTTP方法(其它的暂未实现)
  • FromBody特性修饰符,使得方法的某些参数可以直接从HTTP Post Body中取值
  • 对dynamic类型、匿名类型的支持

相比之下,Raspkate服务所提供的RESTful API编程更为简单快捷。今后如果这部分的确有应用的话,可以对整个结构作进一步完善。

基于轻量型Web服务器Raspkate的RESTful API的实现的更多相关文章

  1. Web服务器Raspkate的RESTful API

    基于轻量型Web服务器Raspkate的RESTful API的实现 在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RE ...

  2. Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器

    最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5+jQuery等流 ...

  3. 轻量型ORM框架Dapper的使用

    在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我 ...

  4. 实战ELK(4)Metricbeat 轻量型指标采集器

    一.介绍 用于从系统和服务收集指标.从 CPU 到内存,从 Redis 到 Nginx,Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据. 1.系统级监控,更简洁(轻量型指标采 ...

  5. Metricbeat 轻量型指标采集器

    一.介绍 用于从系统和服务收集指标.从 CPU 到内存,从 Redis 到 Nginx,Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据. 1.系统级监控,更简洁(轻量型指标采 ...

  6. 五款轻量型bug管理工具横向测评

    五款轻量型bug管理工具横向测评 最近正在使用的本地bug管理软件又出问题了,已经记不清这是第几次了,每次出现问题都要耗费大量的时间精力去网上寻找解决方案,劳心劳力.为了避免再次出现这样的情况,我决定 ...

  7. 轻量的web框架Bottle

    简洁的web框架Bottle 简介 Bottle是一个非常简洁,轻量web框架,与django形成鲜明的对比,它只由一个单文件组成,文件总共只有3700多行代码,依赖只有python标准库.但是麻雀虽 ...

  8. 阿里云轻量服务器价格及轻量与ECS服务器区别比较

    https://yq.aliyun.com/articles/221647 摘要: 阿里云轻量应用服务器价格表及介绍,关于轻量应用服务器和ECS服务器的性能对比 阿里云轻量应用服务器是阿里云新推出的服 ...

  9. TCP/IP协议学习(七) 基于C# Socket的Web服务器---动态通讯实现

    目录 (1).基于Ajax的前端实现 (2).Web服务器后端处理 一个完整的web服务器,不仅需要满足用户端对于图片.文档等资源的需求:还能够对于用户端的动态请求,返回指定程序生成的数据.支持动态请 ...

随机推荐

  1. python自动化测试(2)-自动化基本技术原理

    python自动化测试(2) 自动化基本技术原理 1   概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据. 掌握上面的这样的本领 ...

  2. web前端基础知识

    #HTML    什么是HTML,和他ML...    网页可以比作一个装修好了的,可以娶媳妇的房子.    房子分为:毛坯房,精装修    毛坯房的修建: 砖,瓦,水泥,石头,石子....    精 ...

  3. HTML5 介绍

    本篇主要介绍HTML5规范的内容和页面上的架构变动. 目录 1. HTML5介绍 1.1 介绍 1.2 内容 1.3 浏览器支持情况 2. 创建HTML5页面 2.1 <!DOCTYPE> ...

  4. 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。

    前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...

  5. iOS开发之Masonry框架源码深度解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  6. Collection集合

    一些关于集合内部算法可以查阅这篇文章<容器类总结>. (Abstract+) Collection 子类:List,Queue,Set 增: add(E):boolean addAll(C ...

  7. celery使用的一些小坑和技巧(非从无到有的过程)

    纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的.文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务:二是遇到的几个坑:三是给一些自己配合re ...

  8. 餐饮连锁公司IT信息化解决方案一

             从餐饮企业的信息化需求来说,没有哪一种解决方案能满足所有餐饮企业的信息化建设需要.不同的餐饮业态有不同的业务流程,不同业态的信息化解决方案是目前餐饮企业信息化建设急需的,这种一站式整 ...

  9. ERROR 1300 (HY000): Invalid utf8 character string: ''

    在load csv 进mysql的时候,报这个错,苦恼了很长时间,网上搜索不到答案. mysql>    load data infile '/home/hdh/8_sr/8_45.csv'   ...

  10. 怎样在Dos里切换盘符

    一:在Dos里切换盘符 a:在电脑左下角右击显示图片;(我用的是win10系统,其他系统类似) b:点击运行,输入cmd; c:点击确定: d:输入盘符:(如f:) 或F: 只写字母,不写分号是不行的 ...