2010-08-04 39 views
5

Tôi đang viết một ứng dụng Java nhỏ, thực hiện một dịch vụ http nhận lệnh http từ khách hàng.đọc các giá trị yêu cầu bài viết HttpHandler

Lớp tôi đang sử dụng để triển khai tất cả những điều này là HttpHandler và HttpServer trong com.sun.net. gói.

Bây giờ tôi đang thực hiện một chức năng xử lý (HttpExchange exchange) xử lý yêu cầu, và tôi đang đọc các giá trị bài được nhận bởi yêu cầu vì truy cập duy nhất mà tôi có cho các giá trị này là thông qua HttpExchange.getResponseBody() chỉ là luồng đầu ra.

Tôi đang tìm cách phân tích cú pháp giá trị bài đăng txt và tệp đã tải lên.

Vui lòng trợ giúp.

Cảm ơn.

Trả lời

9

Tôi đã viết các lớp học mà xử lý yêu cầu nhiều phần dữ liệu cho dự án của tôi Sceye-Fi, một máy chủ HTTP sử dụng com.sun.net.httpserver lớp đi kèm với java 6, để nhận được cập nhật ảnh từ một thẻ Eye-Fi.

Điều này có thể giúp tải lên tệp (bài đăng nhiều phần).

Đối với một bài không nhiều phần dữ liệu, bạn sẽ cần phải làm một cái gì đó như thế này:

// 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); 
} 
+0

Tại sao bạn không chuyển tên cho URLDecoder? – ceving

+0

@ceving yes, tên cũng có thể được giải mã URL –

2

Phương án thay thế sẽ sử dụng HttpService từ HttpCore.

Có một máy chủ HTTP Basic ví dụ trong documentation

+0

Không có HttpServer trong httpcore. –

+0

@amadeus Xin lỗi, ý tôi là 'HttpService'. Tôi đã cập nhật câu trả lời. – fglez

Các vấn đề liên quan