Jetty:如何嵌套HandlerWrapper、HandlerList、ContextHandlerCollection、ContextHandler
Jetty: How to nest HandlerWrapper, HandlerList, and ContextHandlerCollection, and ContextHandler
我正在尝试在 Jetty 上构建一个 api 服务器。
我想在看起来像 /apis/api1/endpoint、/apis/api2/endpoint、/apis/api3/endpoint 等的路线上设置多个 api
基本上我有一个 HandlerWrapper,它包含一个 ContextHandlerCollections 的 HandlerList,本质上只是做:
public void handle(...) {
if (uri.startsWith("/apis/")) {
log.info("This is an api request");
this.getHandlerList.handle(...)
} else {
super.handle()
}
}
private HandlerList getHandlerList() {
HandlerList handlerList = new HandlerList();
ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection();
ContextHandler api1 = new ContextHandler("/apis/api1/endpoint");
api1.setHandler(new Api1Handler());
contextHandlerCollection.addHandler(api1);
handlerList.addHandler(contextHandlerCollection);
return handlerList
}
现在当我尝试做的时候:
curl localhost:port/apis/api1/endpoint
我收到 404 not found 但我在日志中看到语句 "This is an api request"。
有什么提示吗?
我基本上希望每个 api1、api2 等都有一个 ContextHandlerCollection。并且 ContextHandlerCollection 应该由一组端点特定的处理程序组成以供选择。
我错过了什么?
干杯,
Handler
- 处理请求的基本形式,它不是请求处理的终点,除非你调用 request.setHandled(true)
HandlerWrapper
- 可以执行某些处理并决定是否应将请求移交给嵌套(包装)处理程序的处理程序。
HandlerCollection
- 一组处理程序,遵循关于执行顺序的标准 java 集合规则。执行集合中的每个处理程序,直到其中一个调用 request.setHandled(true)
HandlerList
- 遵循 java.util.List 子处理程序执行顺序的专用 HandlerCollection
ContextHandler
- 一个专门的 HandlerWrapper,仅在请求上下文路径和虚拟主机匹配时才执行其包装的处理程序。
ContextHandlerCollection
- ContextHandler
的 HashMap 将只执行那些与请求上下文路径(和虚拟主机)匹配的子处理程序(在集合中)
我正在尝试在 Jetty 上构建一个 api 服务器。
我想在看起来像 /apis/api1/endpoint、/apis/api2/endpoint、/apis/api3/endpoint 等的路线上设置多个 api
基本上我有一个 HandlerWrapper,它包含一个 ContextHandlerCollections 的 HandlerList,本质上只是做:
public void handle(...) {
if (uri.startsWith("/apis/")) {
log.info("This is an api request");
this.getHandlerList.handle(...)
} else {
super.handle()
}
}
private HandlerList getHandlerList() {
HandlerList handlerList = new HandlerList();
ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection();
ContextHandler api1 = new ContextHandler("/apis/api1/endpoint");
api1.setHandler(new Api1Handler());
contextHandlerCollection.addHandler(api1);
handlerList.addHandler(contextHandlerCollection);
return handlerList
}
现在当我尝试做的时候:
curl localhost:port/apis/api1/endpoint
我收到 404 not found 但我在日志中看到语句 "This is an api request"。
有什么提示吗?
我基本上希望每个 api1、api2 等都有一个 ContextHandlerCollection。并且 ContextHandlerCollection 应该由一组端点特定的处理程序组成以供选择。
我错过了什么?
干杯,
Handler
- 处理请求的基本形式,它不是请求处理的终点,除非你调用 request.setHandled(true)
HandlerWrapper
- 可以执行某些处理并决定是否应将请求移交给嵌套(包装)处理程序的处理程序。
HandlerCollection
- 一组处理程序,遵循关于执行顺序的标准 java 集合规则。执行集合中的每个处理程序,直到其中一个调用 request.setHandled(true)
HandlerList
- 遵循 java.util.List 子处理程序执行顺序的专用 HandlerCollection
ContextHandler
- 一个专门的 HandlerWrapper,仅在请求上下文路径和虚拟主机匹配时才执行其包装的处理程序。
ContextHandlerCollection
- ContextHandler
的 HashMap 将只执行那些与请求上下文路径(和虚拟主机)匹配的子处理程序(在集合中)