2011-06-24 10 views
6

Estoy tratando de obtener una imagen de una cámara IP mediante HTTP. La cámara requiere la autenticación básica HTTP, por lo que hay que añadir la cabecera de la solicitud correspondiente:Establecer encabezados de solicitud HTTP personalizados en un objeto de URL no funciona

URL url = new URL("http://myipcam/snapshot.jpg"); 
URLConnection uc = url.openConnection(); 
uc.setRequestProperty("Authorization", 
    "Basic " + new String(Base64.encode("user:pass".getBytes()))); 

// outputs "null" 
System.out.println(uc.getRequestProperty("Authorization")); 

tarde estoy pasando el objeto url a ImageIO.read(), y, como se puede adivinar, estoy consiguiendo un HTTP 401 no autorizado, aunque user y pass son correctos.

¿Qué estoy haciendo mal?

También he intentado new URL("http://user:[email protected]/snapshot.jpg"), pero eso tampoco funciona.

Respuesta

1

Incidencia resuelta. No funcionó porque estaba pasando url a ImageIO.read().

En cambio, pasando uc.getInputStream() lo tengo trabajando.

3

En la clase sun.net.www.protocol.http.HttpURLConnection, que se extiende java.net.HttpURLConnection, el método getRequestProperty(String key) siguiente fue anulada para volver null cuando se solicita información sensible de seguridad.

public String getRequestProperty(String key) { 
    // don't return headers containing security sensitive information 
    if (key != null) { 
     for (int i = 0; i < EXCLUDE_HEADERS.length; i++) { 
     if (key.equalsIgnoreCase(EXCLUDE_HEADERS[i])) { 
      return null; 
     } 
     } 
    } 
    return requests.findValue(key); 
} 

Aquí está la declaración de EXCLUDE_HEADERS:

// the following http request headers should NOT have their values 
// returned for security reasons. 
private static final String[] EXCLUDE_HEADERS = { 
    "Proxy-Authorization", "Authorization" }; 

Es por eso que está teniendo un null en uc.getRequestProperty("Authorization"). ¿Has intentado usar HttpClient de Apache?

+0

Gracias, ahora entiendo el motivo para obtener 'null'. Pero, ¿por qué devuelve HTTP 401? ¿Es posible que la propiedad "Autorización" no esté configurada en absoluto? –

+0

@Blagovest Buyukliev, si 'uc amplía HttpURLConnection', a continuación, enchúfelo a' HttpURLConnection' y obtenga 'InputStream' del error llamando' getErrorStream() '. Eso contiene el mensaje del error HTTP 401. Aparte de eso, no puedo ayudarte. –

0

¿Ha intentado crear la subclase URLConnection o HttpURLConnection y anula el método getRequestProperty()?

+0

Intenté 'HttpURLConnection uc = (HttpURLConnection) url.openConnection()', pero el resultado es el mismo. Mi problema no es realmente con 'getRequestProperty', sino con el encabezado de autorización no enviado. –

+0

entonces quizás anule el método 'openConnection'? –

Cuestiones relacionadas