处理HTTP方法重写
许多公司和其他服务对它们允许外部使用的RESTHTTP方法施加了限制。有些是松散的,允许任何方法,大多数方法只允许一个小而得体的集合,有些则只允许GET和POST。这种限制的原因各不相同:浏览器或客户端的限制,或者是非常严格的公司防火墙。只有GET和POST的Web服务不能很好地表达REST思想。PUT、DELETE、OPTIONS等对于指定对资源执行的操作非常有用。为了解决这个问题,我们创建了X-HTTP-METHOD-OVERRIDE HTTP头作为解决方法。
通过使用GET/POST发送请求以及请求应该在X-HTTP-method-OVERRIDE HTTP头中真正处理的方法,服务器应该识别头并重定向到适当的方法。
Vert.x允许用户这样做,只需:
router.route().handler(MethodOverrideHandler.create());
router.route(HttpMethod.GET, "/").handler(ctx -> {
// do GET stuff...
});
router.route(HttpMethod.POST, "/").handler(ctx -> {
// do POST stuff...
});
因为这段代码将重定向请求,避免不必要的请求是明智的。所以最好是将MethodOverrideHandler作为第一个处理器。
另外,提醒一句:这可能会成为不受欢迎的人的攻击媒介!
为了缓解这种问题,MethodOverrideHandler默认带有安全降级策略。该政策规定,如果出现以下情况,X-HTTP-method-OVERRIDE中包含的方法可以覆盖原始方法:
- 重写方法是幂等的;或
- 重写方法是安全的,并且要重写的方法不是幂等的;或
- 被推翻的方法是不安全的。
尽管我们不建议,Vert.x不会强迫你做任何事情。如果您希望允许任何覆盖,那么:
router.route().handler(MethodOverrideHandler.create(false));
router.route(HttpMethod.GET, "/").handler(ctx -> {
// do GET stuff...
});
router.route(HttpMethod.POST, "/").handler(ctx -> {
// do POST stuff...
});