介绍

polaris是一个用go实现的支持restful的web框架,主要参考tornado进行设计。

虽然在go里面搭建一个http server非常的简单,这里强烈推荐gorilla,但并没有很好的对restful模型进行支持。考察了很多开源实现,我决定还是重新造一个轮子,毕竟难度也不怎么大,而且能够根据项目的使用慢慢调整完善。

使用

设计polaris还是参考了tornado,虽然一段时间不用python了,但是我还是对tornado念念不忘。

polaris,我现在只支持get,post,put,head和delete这几种method,剩下的貌似我也没用到过。只要一个对象,它提供了以上一个或多个接口,就能注册进polaris的router中。

先上一个例子:

type Handler1 struct {

}

func (h *Handler1) Prepare(env *Env) {
fmt.Println("hello prepare")
} func (h *Handler1) Get(env *Env) {
env.WriteString("hello get")
} func (h *Handler1) Post(env *Env) {
env.WriteString("hello post")
} type Handler2 struct { } //id is a captured submatch for regexp url below
func (h *Handler2) Get(env *Env, id string) {
env.WriteString("hello " + id)
} r = NewRouter() r.Handle("/handler1", new(Handler1))
r.Handle("/handler2/([0-9]+)", new(Handler2)) http.Handle("/", r)
http.ListenAndServe("127.0.0.1:11181", nil)

上面,我们实现了两个handler,对于每一个handler,需要实现以下一个或多个接口:

Get(env *Env)
Post(env *Env)
Head(env *Env)
Put(env *Env)
Delete(env *Env)

Env用以表明该次请求的上下文环境,主要是为了纪念一个内部库stars,以此命名。

鉴于tornado也提供了prepare支持,所以,如果handler提供了Prepare(env *Env)接口,每次调用相应的函数的时候,会优先调用Prepare。

在handler2中,我们可以看到,Get函数多了一个参数id,这主要是为了处理对应的正则url里面含有group的情况。上面handler2对应的url里面有一个([0-9]+) group,所以当url匹配成功之后,我们会将该group实际的数据传递给handler2。

因为正则匹配的结果都是string,所以Get后面的参数都必须是string类型的。实际的类型转换需要handler自行处理。

路由规则

polaris的路由规则比较简单,参考nginx分为literal pattern和regexp pattern两种。当有请求需要处理的时候,首先查看是否在literal pattern中,如果不是,则根据注册的regexp pattern依次匹配。

上面的例子中,/handler1就是literal pattern,而/handler2/([0-9]+)则是regexp pattern。在go中,判断一个字符串是否是正则表达式,只要通过regexp.QuoteMeta就可以了,如果得到的值跟原字符串一样,该字符串就是literal pattern。

实现

polaris核心实现是基于reflect,这里列举一些:

判断一个handler是否具有相关接口

  • reflect.ValueOf(handler)得到handler的value v
  • v.MethodByName("Get")得到get function的value m
  • m.Kind() == reflect.Func判断是否存在Get函数

判断接口是否满足规范

  • m.NumIn()获取该函数输入参数的个数
  • m.In(0).Kind() == reflect.Ptr和m.In(0).String() == "*polaris.Env"判断第一个参数必须为*Env
  • m.In(i).Kind() == reflect.String判断第i(i>=1)个参数必须为string

根据传入的参数调用相应的函数

  • 根据传入的http request method找到对应的函数 m
  • values = make([]relfect.Value, nArgs)
  • 通过reflect.ValueOf填充参数,第一个参数为*Env
  • m.Call(values),使用Call进行函数调用

后续

现在的polaris只支持基本的restful模型,后续我考虑将自己开发的其他库,譬如log,mysql等进行整合,使其真正成为一个可用的restful web framework。

代码在这里https://github.com/siddontang/polaris,欢迎大家反馈。

polaris: 一个用go实现的支持restful的web框架的更多相关文章

  1. RestKit ,一个用于更好支持RESTful风格服务器接口的iOS库

    简介 RestKit 是一个用于更好支持RESTful风格服务器接口的iOS库,可直接将联网获取的json/xml数据转换为iOS对象. 项目主页: RestKit 最新示例: 点击下载 注意: 如果 ...

  2. SSM整合 完美支持RESTful(Jsp和客户端<android ios...>)

    一 RESTful简介 RESTful是一种网络应用程序的设计风格和开发方式 它结构清晰 符合标准 易于理解 扩展方便 REST 即Representational State Transfer的缩写 ...

  3. 一个国外网盘pCloud——支持离线下载

    给大家分享一个国外网盘<支持离线下载> https://my.pcloud.com/#page=register&invite=HiegZ8aBrt7

  4. java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 使用过程 和servlet差不多

    java nio 写一个完整的http服务器  支持文件上传   chunk传输    gzip 压缩      也仿照着 netty处理了NIO的空轮询BUG        本项目并不复杂 代码不多 ...

  5. 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<支持JDK19虚拟线程的web ...

  6. Resty 一款极简的restful轻量级的web框架

    https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...

  7. 从实体框架核心开始:构建一个ASP。NET Core应用程序与Web API和代码优先开发

    下载StudentApplication.Web.zip - 599.5 KB 下载StudentApplication.API.zip - 11.5 KB 介绍 在上一篇文章中,我们了解了实体框架的 ...

  8. 第一个web框架tornado

    简介 tornado,是我学到的第一个web框架是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google ...

  9. 从零构建一个简单的 Python Web框架

    为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何 ...

随机推荐

  1. UDP网络编程

    概念: UDP协议(用户数据报协议)是无连接,不可靠的,无序的.速度比较快, UDP协议以数据报作为数据传输的载体 进行数据传输时,首先将传输的数据定义成数据报(Datagram),在数据报中指明数据 ...

  2. 工作流程,编程,调试,性能:Unity游戏开发者应该学习的20个改进技巧

    Unity 是一个备受欢迎的游戏开发平台.它的功能令人印象深刻,同时也迎合了不同的游戏开发需求.游戏开发者可以使用 Unity 创建任何类型的游戏,从世界级的 RPG 游戏到最流行的增强现实游戏 Po ...

  3. jQuery 学习笔记一

  4. Node.js 加密

    稳定性: 2 - 不稳定; 正在讨论未来版本的 API 改进,会尽量减少重大变化.详见后文. 使用 require('crypto') 来访问这个模块. 加密模块提供了 HTTP 或 HTTPS 连接 ...

  5. cassandra 常见问题

    摘要 本文主要介绍在部署cassandra集群以及使用cassandra过程中遇到的一些问题. 文章只发布在CSDN 和个人站点 更多nosql文章可以访问stone fang 个人主页 正文 Q1: ...

  6. 在java程序中实现发送邮件的功能

    最近比较忙,在做一个人事管理系统的项目,在这项目需求中,需要一个发送邮件的功能.这个时候我们可以使用javamail的jar包来实现完美需要的功能,在这里简单的分享一个最基础的发邮件功能. 首先我们需 ...

  7. 制作pypi上的安装库

    下载地址 如何制作分发工具呢 setuppy 源码包 其他文件 制作过程 首先上场的肯定是setuppy了如下 然后是LICENCE 注册 测试 总结 自从接触Python以来也有几个月了,虽然主要的 ...

  8. Kafka学习笔记1:概念

    一.简介 Apache Kafka是一个分布式的消息系统,作为一个分布式的日志提交服务. Kafka 是一个分布式的.可分区的.可复制的日志提交服务. 它提供了功能性的消息系统,有它自己独特的设计. ...

  9. [nginx] 对UA为空的请求返回403

    nginx blocking blank user agent . sometime apps' backgroud request always visit a url, and these req ...

  10. Android Multimedia框架总结(八)Stagefright框架之AwesomePlayer及数据解析器

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼:http://blog.csdn.net/hejjunlin/article/details/52503057 前言:前面一篇分析了medi ...