2012-07-30 26 views
5

Estoy tratando de OBTENER una url usando HTTPUrlConnection, sin embargo, siempre obtengo un código de 500, pero cuando intento acceder a esa misma URL desde el navegador o usar curl, ¡funciona bien!Java HTTPUrlConnection devuelve el código de estado 500

Este es el código

try{ 
    URL url = new URL("theurl"); 
    HttpURLConnection httpcon = (HttpURLConnection) url.openConnection(); 
    httpcon.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
    httpcon.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:14.0) Gecko/20100101 Firefox/14.0.1"); 
    System.out.println(httpcon.getHeaderFields()); 
    }catch (Exception e) { 
     System.out.println("exception "+e); 
    } 

Al imprimir los campos de cabecera, se muestra el código 500 .. cuando cambio la URL para otra cosa, como google.com, que funciona bien. Pero no entiendo por qué no funciona aquí, pero funciona bien en el navegador y con curl.

Cualquier ayuda sería muy apreciada ..

Gracias,

+0

500 es para el error interno del servidor –

+0

¿cuál es 'theurl' que ha intentado? – sunil

+0

@sunil Probé http://www.rassd.com/1-23544.htm – user1069624

Respuesta

1

Asegúrese de que su conexión permite las siguientes redirecciones: esta es una de las posibles razones de la diferencia de comportamiento entre su conexión y el navegador (permite redireccionar por defecto).

Debería devolver el código 3xx, pero puede que haya algo más que lo cambie a 500 para su conexión.

+0

emm .. No creo que este sea el problema, porque no me redirigen cuando Lo intento en el navegador ... pero gracias por la pista. – user1069624

+0

Después de leer más detalles de error de la secuencia de error sugerido por Muse. Si no se redirecciona, la única otra posibilidad que se me ocurre es que el servidor espera algo más (cookie, otro tipo de encabezados) en su solicitud. Copiaría TODOS los encabezados pasados ​​por su navegador en la solicitud exitosa (debería dar como resultado una llamada HttpURLConnection exitosa) y luego trabajaré hacia atrás eliminando un encabezado a la vez. –

+0

Bien, creo que sé lo que está mal. La página está baja, pero desde el navegador creo que solía obtener la versión en caché ... ¿podría ser eso? porque esa página no funciona en absoluto ... pero cuando pruebo otra página bajo el mismo host ... ¡funciona! – user1069624

7

Esto sucede principalmente debido a la codificación. Si está utilizando el navegador OK, pero recibe 500 (error interno del servidor) en su programa, es porque los navegadores tienen un código altamente sofisticado con respecto a conjuntos de caracteres y tipos de contenido.

Aquí está mi código y funciona en el caso de ISO8859_1 como juego de caracteres y en inglés.

public void sendPost(String Url, String params) throws Exception { 


    String url=Url; 
    URL obj = new URL(url); 
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 

    con.setRequestProperty("Acceptcharset", "en-us"); 
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 
    con.setRequestProperty("charset", "EN-US"); 
    con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
    String urlParameters=params; 
    // Send post request 
    con.setDoOutput(true); 
    con.setDoInput(true); 
    con.connect(); 
    //con. 

    DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
    wr.writeBytes(urlParameters); 
    wr.flush(); 
    wr.close(); 

    int responseCode = con.getResponseCode(); 
    System.out.println("\nSending 'POST' request to URL : " + url); 
    System.out.println("Post parameters : " + urlParameters); 
    System.out.println("Response Code : " + responseCode); 

    BufferedReader in = new BufferedReader(
      new InputStreamReader(con.getInputStream())); 
    String inputLine; 
    StringBuffer response = new StringBuffer(); 

    while ((inputLine = in.readLine()) != null) { 
     response.append(inputLine); 
    } 
    in.close(); 

    //print result 
    System.out.println(response.toString()); 
    this.response=response.toString(); 
    con.disconnect(); 

} 

y en el programa principal, lo llaman así:

myclassname.sendPost("https://change.this2webaddress.desphilboy.com/websitealias/orwebpath/someaction","paramname="+URLEncoder.encode(urlparam,"ISO8859_1")) 
2

me encontré con el problema de la "URL funciona en el navegador, pero cuando lo hago http-get en Java consigo un 500 Error".

En mi caso el problema era que el http-get regulares terminó en un bucle de redireccionamiento infinita entre /default.aspx y /login.aspx

 URL oUrl = new URL(url); 
     HttpURLConnection con = (HttpURLConnection) oUrl.openConnection(); 
     con.setRequestMethod("GET"); 
     ... 
     int responseCode = con.getResponseCode(); 

Lo que estaba ocurriendo era: El servidor sirve una cookie de tres partes y con.getResponseCode() solo usó una de las partes. Los datos de las cookies en la cabecera eran los siguientes:

header.key = null 
    value = HTTP/1.1 302 Found 
... 
header.key = Location 
    value = /default.aspx 
header.key = Set-Cookie 
    value = WebCom-lbal=qxmgueUmKZvx8zjxPftC/bHT/g/rUrJXyOoX3YKnYJxEHwILnR13ojZmkkocFI7ZzU0aX9pVtJ93yNg=; path=/ 
    value = USE_RESPONSIVE_GUI=1; expires=Wed, 17-Apr-2115 18:22:11 GMT; path=/ 
    value = ASP.NET_SessionId=bf0bxkfawdwfr10ipmvviq3d; path=/; HttpOnly 
... 

Así el servidor al recibir sólo un tercio de los datos necesarios se confundió: está conectado! No, espera, tienes que iniciar sesión. No, has iniciado sesión, ...

Para evitar el infinito redireccionamiento de bucle, tuve que buscar manualmente los redireccionamientos y analizar manualmente las entradas "Set-cookie" en el encabezado.

  con = (HttpURLConnection) oUrl.openConnection(); 
      con.setRequestMethod("GET"); 
      ... 
      log.debug("Disable auto-redirect. We have to look at each redirect manually"); 
      con.setInstanceFollowRedirects(false); 
      .... 
      int responseCode = con.getResponseCode(); 

Con este código al análisis sintáctico de la galleta, si conseguimos un redireccionamiento en el ResponseCode:

private String getNewCookiesIfAny(String origCookies, HttpURLConnection con) { 
    String result = null; 
    String key; 
    Set<Map.Entry<String, List<String>>> allHeaders = con.getHeaderFields().entrySet(); 
    for (Map.Entry<String, List<String>> header : allHeaders) { 
     key = header.getKey(); 

     if (key != null && key.equalsIgnoreCase(HttpHeaders.SET_COOKIE)) { 
      // get the cookie if need, for login 
      List<String> values = header.getValue(); 
      for (String value : values) { 
       if (result == null || result.isEmpty()) { 
        result = value; 
       } else { 
        result = result + "; " + value; 
       } 
      } 
     } 
    } 
    if (result == null) { 
     log.debug("Reuse the original cookie"); 
     result = origCookies; 
    } 
    return result; 
} 
0

En mi caso resultó que el servidor siempre devuelve HTTP/1.1 500 (en el explorador como en Java) para la página a la que quería acceder, pero que sin embargo proporciona el contenido de la página web.

Un humano que accede a la página específica a través del navegador simplemente no se da cuenta, ya que verá la página y no hay mensaje de error, en Java tuve que leer la secuencia de error en lugar de la entrada (gracias @Muse).

No tengo ni idea de por qué, sin embargo. Puede ser una forma oscura de mantener rastreadores fuera.

0

Esta es una vieja pregunta, pero he tenido el mismo problema y lo he resuelto de esta manera.

Esto podría ayudar a otros es la misma situación.

En mi caso yo estaba desarrollando un sistema en el entorno local, y todo funcionó bien cuando revisé mi Rest Api desde el navegador, pero todo el tiempo cometí un error HTTP 500 en mi sistema Android.

El problema es que cuando trabajas en Android, funciona en VM (máquina virtual), eso significa que el firewall de tu computadora local podría impedir que tu máquina virtual acceda a la dirección URL local (IP).

Solo tiene que permitir eso en el firewall de su computadora. Lo mismo se aplica si intenta acceder al sistema desde fuera de su red.

0

Me enfrenté al mismo problema, y ​​nuestro problema era que había un símbolo especial en uno de los valores de los parámetros. Lo arreglamos usando URLEncoder.encode(String, String)

Cuestiones relacionadas