2

我正在尝试实现一个自定义的 Grizzly HttpHandler,但尝试简单地从传入请求中提取路径信息失败了。请参阅下面的最小示例:

public class PathInfoTest {
    public static void main(String[] args) throws IOException {
        final HttpServer httpServer = new HttpServer();
        final NetworkListener nl = new NetworkListener(
                "grizzly", "localhost", 8080);
        httpServer.addListener(nl);
        httpServer.getServerConfiguration().addHttpHandler(
                new HandlerImpl(), "/test");   
        httpServer.start();
        System.in.read();
    }

    private static class HandlerImpl extends HttpHandler {
        @Override
        public void service(Request request, Response response)
                throws Exception {

            System.out.println(request.getPathInfo());
            System.out.println(request.getContextPath());
            System.out.println(request.getDecodedRequestURI());
            System.out.println(request.getHttpHandlerPath());
    }
}

我认为这会告诉 Grizzly,URL 以“/test”开头的所有传入请求都应该由 处理HandlerImpl,这似乎到目前为止有效。但是,在对 执行 GET 时http://localhost:8080/test/foo,此代码将以下内容打印到stdout

null
/test
/test/foo
null

我主要关心的是第一个null,它应该是路径信息。我希望它出现foo在这个例子中,而不是null. 有人可以向我解释一下:

  1. 为什么两者都有,getHttpHandlerPath()并在这个例子中getPathInfo()返回?null
  2. 另外,我怀疑后者是第一个的结果,对吗?
  3. 如何在 Grizzly 中获取 URL 的“未路由”部分?
4

1 回答 1

3

您必须在映射中使用星号(类似于 Servlet)才能看到正确的 pathInfo 值。例如,请使用以下映射:

httpServer.getServerConfiguration().addHttpHandler(
     new HandlerImpl(), "/test/myhandler/*");

并提出要求http://localhost:8080/test/myhandler/foo/bar

结果将是:

/foo/bar
/test
/test/myhandler/foo/bar
/myhandler
于 2013-09-23T22:16:03.130 回答