【问题标题】:Java and CGI - how to properly parse a filename and a QUERY_STRING from a URL?Java 和 CGI​​ - 如何正确解析来自 URL 的文件名和 QUERY_STRING?
【发布时间】:2014-02-10 18:06:16
【问题描述】:

在 Java 中,我希望能够解析 URL 以将其分解为文件名和 QUERY_STRING。

到目前为止,我有以下代码:

if (line != null && !line.trim().equals("")) {
    StringTokenizer st = new StringTokenizer(line);
    if (st.nextToken().equals("GET") && st.hasMoreTokens()) {
        filename = st.nextToken();
        if (filename.startsWith("/")) {
            filename = filename.substring(1);
            if (st.nextToken().equals(".cgi?") && st.hasMoreTokens()) {
                queryString = st.nextToken();
            }
        }
    }
}

我特别想做的是将 URL 分解为一个文件名和一个 QUERY_STRING,因为我可以调用 exec 来使用正确的环境变量运行我的 cgi 文件。但是,我的解决方案不会在到达文件名后面的问号之前终止文件名。有人可以帮我吗?

编辑:基本上,我想从 HTTP 请求中获取 URL,并从 URL 中获取文件名和 QUERY_STRING

【问题讨论】:

  • 也许您可以重用一些来自 java servlet 的代码。他们还必须从 GET 解析参数(或者您甚至可以使用 java servlet)
  • 一开始为什么不想使用基于 Servlet 的解决方案?

标签: java parsing cgi query-string filenames


【解决方案1】:

这就是 java servlet 解析 GET 参数的方式

http://grepcode.com/file/repo1.maven.org/maven2/javax.servlet/servlet-api/2.5/javax/servlet/http/HttpUtils.java#HttpUtils.parseQueryString%28java.lang.String%29

static public Hashtable parseQueryString(String s) {

    String valArray[] = null;

    if (s == null) {
        throw new IllegalArgumentException();
    }
    Hashtable ht = new Hashtable();
    StringBuffer sb = new StringBuffer();
    StringTokenizer st = new StringTokenizer(s, "&");
    while (st.hasMoreTokens()) {
        String pair = (String)st.nextToken();
        int pos = pair.indexOf('=');
        if (pos == -1) {
        // XXX
        // should give more detail about the illegal argument
        throw new IllegalArgumentException();
        }
        String key = parseName(pair.substring(0, pos), sb);
        String val = parseName(pair.substring(pos+1, pair.length()), sb);
        if (ht.containsKey(key)) {
        String oldVals[] = (String []) ht.get(key);
        valArray = new String[oldVals.length + 1];
        for (int i = 0; i < oldVals.length; i++) 
            valArray[i] = oldVals[i];
        valArray[oldVals.length] = val;
        } else {
        valArray = new String[1];
        valArray[0] = val;
        }
        ht.put(key, valArray);
    }
    return ht;
    }

当然,由于这个方法是公开的,你可能只想直接使用 HttpUtils :-)

更新:对于其他低级http解析,我建议http://hc.apache.org/index.htmlhttp://www.java2s.com/Code/Java/Network-Protocol/HttpParser.htm

【讨论】:

  • 我明白你的意思,但我想在分解 QUERY_STRING 本身之前将 URL 分解为文件名和 QUERY_STRING。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2019-04-03
相关资源
最近更新 更多