目录
- Vert.x系列(零),开篇,认识Vert.x并创建一个Http服务
- Vert.x系列(一),Http Router
- Vert.x系列(二),编写REST API并解析请求参数
- Vert.x系列(三),加载静态资源文件
- Vert.x系列(四),EventBus事件总线
- Vert.x系列(五),基于EventBus构建分布式应用
正文
在我们日常开发中一般常用的传递参数方式有表单式的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