zoukankan      html  css  js  c++  java
  • 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 }
    View Code

    二:新建一个返回错误编码类

     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 }
    View Code

    三:修改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("
     ---network io error:"+it.getMessage());
                    return;
                }
                logger.error("
     ---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: 
    " + 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

    项目结构:

  • 相关阅读:
    安利博客
    python 的高阶算法之堆排序
    functools模块用途
    类型注解
    高阶函数和装饰器
    生成器

    递归函数
    匿名函数
    函数 的 返回值作用域
  • 原文地址:https://www.cnblogs.com/cj8988/p/15011294.html
Copyright © 2011-2022 走看看