Vert.x系列(二),编写REST API并解析请求参数

唐际忠的博客 2020-03-12 20:34:02

在我们日常开发中一般常用的传递参数方式有表单式的form、GET式的查询参数、还有现在最流行的未经过加工的raw形式。

raw格式参数,就是将数据放置在请求的body中,现在一般以JSON形式体现。

在Vert.x中接收参数需要在Router中添加BodyHandler,这个Handler用来负责从最原始的请求中将参数数据解析出来。

router.route().handler(BodyHandler.create());

接下来举个栗子,创建一个/user的接口,接收前端发送过来的参数,然后组装成一个响应的JSON报文,返回给前端。


代码
package com.javafm.vertx;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.http.HttpServer;
import io.vertx.core.json.Json;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.handler.BodyHandler;

import java.util.HashMap;
import java.util.Map;

public class SimpleHttpServerVerticle extends AbstractVerticle {
    @Override
    public void start() throws Exception {
        HttpServer server = vertx.createHttpServer();

        Router router = Router.router(vertx);
        router.route().handler(BodyHandler.create());

        router.post("/user").handler(this::addUser);

        server.requestHandler(router);
        server.listen(8080);
    }

    private void addUser(RoutingContext ctx) {
        JsonObject json = ctx.getBody().toJsonObject();

        Map<String, Object> result = new HashMap<>();
        result.put("code", 0);
        result.put("msg", "success");
        result.put("data", json);

        out(ctx, Json.encodePrettily(result));
    }

    private void out(RoutingContext ctx, String msg) {
        ctx.response().putHeader("Content-Type", "application/json; charset=utf-8")
                .end(msg);
    }
}

测试结果

在整个代码中需要注意的地方就是router.route().handler(BodyHandler.create());这行代码,router对应的handler也是有执行顺序的,所以这行代码一定要放在你需要解析参数的router前面。

上面代码是获取raw格式参数,那么如果要获取表单或者GET查询参数怎么办呢?也很简单,直接通过ctx.request().getParam()方法来获取就可以了,方法的参数就是要获取的参数名称。

在Vert.x中提供了非常方便的JSON序列工具,所以无需在引入其它JSON框架了。

本文源代码地址:https://gitee.com/dev-tang/learning-vertx/tree/learn-03

本文标题:Vert.x系列(二),编写REST API并解析请求参数

本文地址:https://dev-tang.com/post/2020/03/vert.x-02.html