2010-08-04 7 views
5

Estoy escribiendo una pequeña aplicación de Java que implementa un servicio http que recibe comandos HTTP post de un cliente.leer los valores de la solicitud de publicación HttpHandler

La clase que estoy utilizando para implementar todo esto es HttpHandler y HttpServer en com.sun.net. paquete.

Ahora estoy implementando una función de manejo (HttpExchange exchange) que maneja la solicitud, y tengo truble leyendo los valores de la publicación recibidos por la solicitud porque el único acceso que tengo a estos valores es a través de HttpExchange.getResponseBody() que es solo un flujo de salida.

Estoy buscando para analizar los valores de la publicación de texto y los archivos cargados.

Por favor ayuda.

Gracias.

Respuesta

9

He escrito clases que procesan las solicitudes de varias partes de mi proyecto Sceye-Fi, un servidor HTTP que utiliza los com.sun.net.httpserver clases que vienen con Java 6, cargar fotos desde una tarjeta Eye-Fi.

Esto puede ayudar con la carga de archivos (publicaciones de varias partes).

Para un puesto no multiparte, que tendría que hacer algo como esto:

// 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

¿Por qué no le pasas el nombre al URLDecoder? – ceving

+0

@ceving yes, el nombre también podría ser URL-decodificado –

2

Una alternativa sería usar HttpService de HttpCore.

Hay un ejemplo de servidor HTTP básico en el documentation

+0

No hay HttpServer en httpcore. –

+0

@amadeus Lo siento, quise decir 'HttpService'. He actualizado la respuesta. – fglez

Cuestiones relacionadas