Vertx 实现webapi实战项目(四)
本节主要介绍使用消息解析和handler分发
一:定义一个常量类,储存消息id
public class HandlerCode {
/***** 测试接口 ******/
public static final short DAILY_LEVEL = 101;
}
定义一个返回信息枚举类
1 public enum HttpStatus {
2 OK(200, "success"),
3 PLAYER_REGISTER(201,"head register"),
4 REDIRECT_LOGIN(202,"remote device login"),
5
6 ERROR(501, "error"),
7 JSON_ERROR(502,"json error"),
8 PARAMETER_ERROR(503,"parameter error");
9
10 private final int code;
11 private final String message;
12
13 HttpStatus(int code, String message) {
14 this.code = code;
15 this.message = message;
16 }
17
18 public int code() {
19 return code;
20 }
21
22 public String message() {
23 return message;
24 }
25 }
二:新建一个返回错误编码类
1 public class NetDownError extends AbstractDownMessage {
2 public NetDownError(short requestId, HttpStatus status){
3 this.messageId = requestId;
4 this.resultCode = status.code();
5 }
6
7 @Override
8 protected void encodeBody() {
9
10 }
11 }
三:修改httpServerVerticle解析消息。红色为修改的地方。
public class HttpServerVerticle extends AbstractVerticle {
private final Logger logger = LoggerFactory.getLogger(HttpServerVerticle.class);
private HttpServer httpServer;
private IMessageRecognizer recognizer;
@Override
public void start(Promise<Void> startPromise) throws Exception {
recognizer = new MessageRecognizer();
HttpServerOptions options = new HttpServerOptions()
.setIdleTimeout(10000)
.setIdleTimeoutUnit(TimeUnit.MILLISECONDS)
.setTcpKeepAlive(true);
httpServer = vertx.createHttpServer(options);
httpServer.exceptionHandler( it -> {
if(it instanceof IOException){
logger.error("\n ---network io error:"+it.getMessage());
return;
}
logger.error("\n ---net error:"+it.getMessage());
});
// httpServer.requestHandler(req -> {
// HttpServerResponse resp = req.response().setStatusCode(200);
// resp.putHeader("content-type", "application/json");
// resp.putHeader("connection", "Keep-Alive");
//
// JsonObject js = new JsonObject().put("ke","demos");
// resp.end(js.encode());
// });
httpServer.requestHandler(this::handleRequest);
httpServer.listen(8888,"127.0.0.1",res -> {
if (res.succeeded()) {
startPromise.complete();
logger.info("HTTP server started on port 8888");
} else {
startPromise.fail(res.cause());
logger.error(res.cause().getMessage());
}
});
}
private void handleRequest(HttpServerRequest request){
request.bodyHandler(body -> {
HttpServerResponse resp = request.response().setStatusCode(200);
resp.putHeader("content-type", "application/json");
resp.putHeader("connection", "Keep-Alive");
//解析上传的json数据
JsonObject upData = AbstractMessage.decodeUpMessage(body);
if(upData == null){
//上传json参数有误
AbstractDownMessage output = new NetDownError((short)-1, HttpStatus.JSON_ERROR);
output.encode();
resp.end(output.SendMessage());
logger.error("json error: \n" + body.toString());
return;
}
AbstractDownMessage output;
short messageId = upData.getInteger("mId",-1).shortValue();
MessageFactory input = recognizer.recognize(messageId);
if(input == null){
output = new NetDownError((short)-1,HttpStatus.ERROR);
output.encode();
resp.end(output.SendMessage());
return;
}
InterHandler handlerManager = HandlerManager.getInstance().getHandler(messageId);
if(handlerManager == null){
logger.error("not handler :"+messageId);
output = new NetDownError(messageId,HttpStatus.ERROR);
output.encode();
resp.end(output.SendMessage());
return;
}
input.decode(messageId,upData,request);
handlerManager.handler((AbstractUpMessage)input,resp);
});
}
@Override
public void stop(){
httpServer.close();
logger.error(" AppLogin Server stop ------");
}
四:因为还没有测试handler,所以启动服务器返回会返回code:501

项目结构:

Vertx 实现webapi实战项目(四)的更多相关文章
- Vuejs实战项目四:权限校验
路由跳转参考文档:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html 在/src下创建permission.js进行权限 ...
- C# WebApi+Task+WebSocket实战项目演练(四)
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第四部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
- ASP.NET WebAPI数据传输安全HTTPS实战项目演练
一.课程介绍 HTTPS是互联网 Web 大势所趋,各大网站都已陆续部署了 HTTPS . 全站HTTPS时代,加密用户与网站间的交互访问,在客户端浏览器和Web服务器之间建立安全加密通道,一般情况 ...
- .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练
写在前面 上篇文章我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文件的加载方式,最后引出了依赖注入以及控制反转的概念!如果大家把前面几张都理解了 ...
- Android项目实战(四十九):Andoird 7.0+相机适配
解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...
- Android项目实战(四十四):Zxing二维码切换横屏扫描
原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=&q ...
- Android项目实战(四十):在线生成按钮Shape的网站
原文:Android项目实战(四十):在线生成按钮Shape的网站 AndroidButton Make 右侧设置按钮的属性,可以即时看到效果,并即时生成对应的.xml 代码,非常高效(当然熟练的话 ...
- 项目四:Java秒杀系统方案优化-高性能高并发实战
技术栈 前端:Thymeleaf.Bootstrap.JQuery 后端:SpringBoot.JSR303.MyBatis 中间件:RabbitMQ.Redis.Druid 功能模块 分布式会话,商 ...
- Vue2+VueRouter2+webpack 构建项目实战(四)接通api,先渲染个列表
Vue2+VueRouter2+webpack 构建项目实战(四)接通api,先渲染个列表: Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述
- .NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理
通过 ASP.NET Core,开发者可轻松配置和管理其应用的安全性. ASP.NET Core 中包含管理身份验证.授权.数据保护.SSL 强制.应用机密.请求防伪保护及 CORS 管理等等安全方面 ...
随机推荐
- SDF矩形(附圆角)公式推导
SDF矩形(附圆角)公式推导 矩形 一般情况下,我们会使用(top_left, top_bottom), (width, height)来定义一个矩形,但是对于SDF而言,使用(centerX, ce ...
- 【Git】在 Eclipse 中使用 Git
在 Eclipse 中使用 Git Eclipse 中默认自带了 Git 插件,通过点击 Help→About Eclipse IDE 可以查看 1 全局配置 1.1 配置用户名和邮箱 点击 Wind ...
- Selenium+pytest 页面对象模型框架
下载地址:https://gitee.com/xiaopo1998/web_ui_test.git Selenium 页面对象模型框架使用说明 本框架基于 Selenium WebDriver 实现了 ...
- AnnotationAwareAspectJAutoProxyCreator后置处理器的BeanDefinition定义信息导入和其对象实例创建过程
步骤1 我们从配置类上的@EnableAspectJAutoProxy 注解入手,进入发现这个注解上又有一个@Import(AspectJAutoProxyRegistrar.class)注解, 了解 ...
- 🎀FreeMarker 禁止自动转义标签-noautoesc
简介 FreeMarker 是一个用 Java 语言编写的模板引擎,它被设计用来生成文本输出(HTML 网页.电子邮件.配置文件等).在 FreeMarker 中,默认情况下,当你在模板中输出变量时, ...
- centos停服,迁移centos7.3系统到新搭建的openEuler
背景 最近在做的事,简单来讲,就是一套系统差不多有10多台虚拟机,都是centos系统,版本主要是7.3.7.6.7.9,现在centos停止维护了,转为了centos stream,而centos ...
- mac系统安装GNU-sed
经过网上查资料,发现 由于 mac 系统与 linux 系统的差异,mac自带的sed命令,因为其是基于bsd,所以与常用的gnu不一样,安装gnu-sed 可正常使用: 1.brew install ...
- 如何创建一个 Win32 窗口并理解其背后的设计
如何创建一个 Win32 窗口并理解其背后的设计 在 Windows 系统中,使用 Win32 API 创建图形用户界面(GUI)应用程序是传统的做法.虽然现在有许多更高层次的开发框架,比如 MFC. ...
- 89.4K star!这个开源LLM应用开发平台,让你轻松构建AI工作流!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Dify 是一款开源的 LLM 应用开发平台,通过直观的可视化界面整合 AI 工作流.RAG ...
- Java Factory工厂模式
/** * 工厂类:用于连接接口和子类,尽量减少客户端的复杂性 * 2017-08-25 * @author Junwei Zhu * */ interface Fruit { public void ...