读取请求值HttpHandler

时间:2010-08-04 20:01:20

标签: java http

我正在编写一个小型Java应用程序,它实现了一个从客户端接收http post命令的http服务。

我用来实现所有这些的类是com.sun.net中的HttpHandler和HttpServer。封装

现在我正在实现一个处理请求的句柄(HttpExchange交换)函数,我正在读取请求收到的帖子值,因为我对这些值的唯一访问是通过HttpExchange.getResponseBody( )这只是一个输出流。

我正在寻找解析txt帖子值和上传文件。

请帮忙。

感谢。

2 个答案:

答案 0 :(得分:10)

我编写了处理我的项目Sceye-Fi的多部分请求的类,这是一个使用java 6附带的com.sun.net.httpserver类的HTTP服务器,用于从Eye-Fi卡接收照片上传

这有助于文件上传(多部分帖子)。

对于非多部分帖子,您需要执行以下操作:

// determine encoding
Headers reqHeaders = exchange.getRequestHeaders();
String contentType = reqHeaders.getFirst("Content-Type");
String encoding = "ISO-8859-1";
if (contentType != null) {
    Map<String,String> parms = ValueParser.parse(contentType);
    if (parms.containsKey("charset")) {
        encoding = parms.get("charset");
    }
}
// read the query string from the request body
String qry;
InputStream in = exchange.getRequestBody();
try {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte buf[] = new byte[4096];
    for (int n = in.read(buf); n > 0; n = in.read(buf)) {
        out.write(buf, 0, n);
    }
    qry = new String(out.toByteArray(), encoding);
} finally {
    in.close();
}
// parse the query
Map<String,List<String>> parms = new HashMap<String,List<String>>();
String defs[] = qry.split("[&]");
for (String def: defs) {
    int ix = def.indexOf('=');
    String name;
    String value;
    if (ix < 0) {
        name = URLDecoder.decode(def, encoding);
        value = "";
    } else {
        name = URLDecoder.decode(def.substring(0, ix), encoding);
        value = URLDecoder.decode(def.substring(ix+1), encoding);
    }
    List<String> list = parms.get(name);
    if (list == null) {
        list = new ArrayList<String>();
        parms.put(name, list);
    }
    list.add(value);
}

答案 1 :(得分:2)

另一种方法是使用HttpService中的HttpCore

documentation

中有一个基本的HTTP服务器示例