- JSON
- Router
- 函数指针
- 对象工厂
- Router : Route = 1 : * , Route : Handler 是 1:1
- 对象序列化为JSON
Employee employee = new Employee();
JsonObject.mapFrom(employee).toString()
- LIST序列化为JSONArray
List<Employee> employees = new ArrayList<Employee>();
new JsonArray(employees).toString(); // 居然不是: JsonArray.mapFrom(employees);
- JsonObject 与 JavaObject 功能
JsonObject 与 JavaObject 的相互转换
// mapFrom
Employee employee = new Employee();
JsonObject json = JsonObject.mapFrom();
// mapTo
JsonObject jsonObject = new JsonObject();
jsonObject.mapTo(Employee.class);
Vertx vertx = Vertx.vertx();
HttpServer server = vertx.createHttpServer();
// why NOT vertx.createRouter()
Router router = Router.router(vertx);
API风格不统一,但是这里的原因是:HttpServer 是
vertx-core
的, Router 是vertx-web
的,属于vertx-core
的拓展。 如果vertx.createRouter()
则会导致vertx-core
依赖于vertx-web
server.requestHandler(mainRouter::accept);
- HttpServer.java
public interface HttpServer {
HttpServer requestHandler(Handler<HttpServerRequest> handler);
}
- Router.java
public class Router {
void accept(HttpServerRequest request);
}
Vertx vertx = Vertx.vertx(); // NOT Vertx vertx = new Vertx();
Router router = Router.router(); // NOT Router router = new Router();
虽然是工厂模式减少 new 的依赖,但是也不向从前的 Vertx vertx = VertxFactory.newInstance();
Route route = dbapiRouter.route(HttpMethod.POST, "/:dbname/:tableName");
route.handler(routingContext -> {
System.out.println("同一个对象route 上 第一次执行");
routingContext.next();
});
route.handler(routingContext -> {
System.out.println("同一个对象route 上 第二次执行"); // 覆盖前者
routingContext.next();
});
// 以下不会后者覆盖前者,因为它们是三个 Route,只不过三者的 匹配完全相同。
dbapiRouter.route(HttpMethod.POST, "/:dbname/:tableName").handler(routingContext -> {
System.out.println("创建前");
routingContext.next();
});
dbapiRouter.route(HttpMethod.POST, "/:dbname/:tableName").handler(dbapiAction::post);
dbapiRouter.route(HttpMethod.POST, "/:dbname/:tableName").handler(routingContext -> {
System.out.println("创建后");
});
我刚困惑的是这个: 前面文档说 一个 Router 可以多个 Route, 一个 Route 对应一个 Handler。 然后我写着 dbapiRouter.route().handler(BodyHandler.create()) 和 dbapiRouter.route().handler( rcx -> {….}) ,发现两个都生效了,然后我就困惑了,我的预期是 后者为什么没有覆盖前者 (因为 “一个 Route 对应一个 Handler” ) ? 原因是 dbapiRouter.route() 前后两次其实弄了两个route() 只不过这两个 route 的匹配规则完全一样而已。
Cookie
vertx.web
为了提高性能,默认情况下是不会解析Cookie的,即便它属于HTTP头的范畴。需要Cookie时,可以在最前面:
读写Cookie
在
servlet
中,读Cookie,是HttpRequest的事;写Cookie,是HttpResponse的事。而 vertx 中,读写Cookie却直接在
routingContext
上。或许是因为不是所有的请求都处理COOKIE。