一. 开发背景
最近半年来,我一直在从事开发公司的自助手机回收机项目。该项目有点类似于 IoT 项目,通过 Android 系统来操作回收机中的各种传感器,以此来控制回收机中的各种硬件。这涉及到各种通信协议,例如串口的通信,还有 TCP、http 协议等。
在我们的回收机中,Android 上使用的 http 服务来自一个第三方的库,从监控上看最近该库报错有一点多。
我们回收机本身提供的 TCP、WebSocket 服务均由 Netty 开发,而 http 服务它运行在TCP之上,因此也可以使用 Netty 来提供 http 服务,从而可以减少第三方库的依赖。
二. AndroidServer 特性
正是基于上面的开发背景,我最近抽空开发了一个 AndroidServer
github 地址:https://github.com/fengzhizi715/AndroidServer
它的特性包括:
支持 Http、TCP、WebSocket 服务
支持 Rest 风格的 API
Http 的路由表采用字典树(Tried Tree)实现
开发者可以使用自己的日志库
core 模块只依赖 netty-all,不依赖其他第三方库
三. AndroidServer 设计原理
3.1 http 服务之 Request、Response
一个完整的 http 服务一定需要 Request、Response
/**
*
* @FileName:
* com.safframework.server.core.http.Request
* @author: Tony Shen
* @date: 2020-03-21 12:31
* @version: V1.0 <描述当前版本功能>
*/
interface Request {
fun method(): HttpMethod
fun url(): String
fun headers(): MutableMap<String, String>
fun header(name: String): String?
fun cookies(): Set<HttpCookie>
fun params(): MutableMap<String, String>
fun param(name: String): String?
fun content(): String
}
/**
*
* @FileName:
* com.safframework.server.core.http.Response
* @author: Tony Shen
* @date: 2020-03-21 13:09
* @version: V1.0 <描述当前版本功能>
*/
interface Response {
fun setStatus(status: HttpResponseStatus): Response
fun setBodyJson(any: Any): Response
fun setBodyHtml(html: String): Response
fun setBodyData(contentType: String, data: ByteArray): Response
fun setBodyText(text: String): Response
fun addHeader(key: CharSequence, value: CharSequence): Response
fun addHeader(key: AsciiString, value: AsciiString): Response
fun addCookie(cookie: HttpCookie): Response
}
在 AndroidServer 中他们的实现者分别是:HttpRequest、HttpResponse。
其中, HttpRequest 包含了 Netty 的 FullHttpRequest,HttpResponse 包含了 Netty 的 Channel、DefaultFullHttpResponse。
FullHttpRequest 包含了 HttpRequest 和 FullHttpMessage,是一个 HTTP 请求的完全体。
通过 FullHttpRequest 可以从中提取 http 请求方法、请求头、请求体的具体信息,包括 cookie、parameter 等等。
Ch