¿Cómo obtener el código de respuesta HTTP para una URL en Java?

144

Dígame los pasos o el código para obtener el código de respuesta de una URL particular.

Ajit
fuente
2
No diría duplicado, ya que quiere el código de respuesta, pero @Ajit deberías comprobarlo de todos modos. Agregue un poco de experimentación y estará listo para comenzar.
slezica
2
En lugar de exigir que otras personas hagan su trabajo por usted. Demuestre que al menos ha intentado realizar esta tarea por su cuenta. Muestre su código actual y cómo ha intentado realizar esta tarea. Si desea que alguien haga su trabajo por usted sin ningún esfuerzo de su parte, puede contratar a alguien y pagarle.
Patrick W. McMahon
¿Qué demanda hizo? Pidió ayuda, en lugar de girar sus ruedas cuando no tenía idea de qué hacer. Estaba usando la comunidad como se pretendía.
Danny Remington - OMS

Respuestas:

180

HttpURLConnection :

URL url = new URL("http://example.com");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.connect();

int code = connection.getResponseCode();

Este no es en absoluto un ejemplo robusto; necesitarás manejar IOExceptionsy todo lo demás. Pero debería ayudarte a comenzar.

Si necesita algo con más capacidad, consulte HttpClient .

Rob Hruska
fuente
2
En mi caso específico y con su método, obtengo una IOException ("Error al autenticar con proxy") que generalmente es un error http 407. ¿Hay alguna manera de obtener una precisión (el código de error http) sobre la excepción generada por el método getRespondeCode ()? Por cierto, sé cómo manejar mi error, y solo quiero saber cómo diferenciar cada excepción (o al menos esta excepción específica). Gracias.
grattmandu03
2
@ grattmandu03 - No estoy seguro. Parece que se está ejecutando en stackoverflow.com/questions/18900143/… (que desafortunadamente no tiene una respuesta). Podría intentar usar un marco de nivel superior como HttpClient, que probablemente le daría un poco más de control sobre cómo maneja respuestas como esa.
Rob Hruska
Ok, gracias por tu respuesta. Mi trabajo es adaptar un código antiguo para trabajar con este proxy, y con menos modificaciones, el cliente comprenderá mejor mi trabajo. Pero supongo que es para mí (en este momento) la única forma de hacer lo que quiero. Gracias de cualquier manera.
grattmandu03
¿Necesita llamar a desconectar () en un bloque finalmente?
Andrew Swan
Probablemente depende, haría una investigación. Los documentos dicen que llamar al disconnect()método puede cerrar el socket subyacente si una conexión persistente está inactiva en ese momento. , lo que no garantiza. Los documentos también dicen que indica que otras solicitudes al servidor son poco probables en el futuro cercano. Llamar disconnect()no debe implicar que esta HttpURLConnectioninstancia se pueda reutilizar para otras solicitudes. Si está utilizando un InputStreampara leer datos, debe close()esa secuencia en un finallybloque.
Rob Hruska
38
URL url = new URL("http://www.google.com/humans.txt");
HttpURLConnection http = (HttpURLConnection)url.openConnection();
int statusCode = http.getResponseCode();
kwo
fuente
11
+1 para un ejemplo más conciso (pero completamente funcional). Bonito ejemplo de URL también ( fondo ) :)
Jonik
obteniendo Excepción en el hilo "principal" java.net.ConnectException: Conexión rechazada: conectar No sé por qué estoy obteniendo esto.
Ganesa Vijayakumar
Justo fuera del tema, estoy tratando de conocer todos los códigos de respuesta que puede generar una conexión: ¿hay un documento?
Skynet
Cómo verificar esto para urls con autenticación básica
Satheesh Kumar
más uno para sugerir la URL google.com/humans.txt
PC.
10

Puedes probar lo siguiente:

class ResponseCodeCheck 
{

    public static void main (String args[]) throws Exception
    {

        URL url = new URL("http://google.com");
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setRequestMethod("GET");
        connection.connect();

        int code = connection.getResponseCode();
        System.out.println("Response code of the object is "+code);
        if (code==200)
        {
            System.out.println("OK");
        }
    }
}
Ashish Sharda
fuente
obteniendo Excepción en el hilo "principal" java.net.ConnectException: Conexión rechazada: conectar. No sé la resonancia
Ganesa Vijayakumar
5
import java.io.IOException;
import java.net.URL;
import java.net.HttpURLConnection;

public class API{
    public static void main(String args[]) throws IOException
    {
        URL url = new URL("http://www.google.com");
        HttpURLConnection http = (HttpURLConnection)url.openConnection();
        int statusCode = http.getResponseCode();
        System.out.println(statusCode);
    }
}
Raja Singh
fuente
4

Esto me ha funcionado:

            import org.apache.http.client.HttpClient;
            import org.apache.http.client.methods.HttpGet;  
            import org.apache.http.impl.client.DefaultHttpClient;
            import org.apache.http.HttpResponse;
            import java.io.BufferedReader;
            import java.io.InputStreamReader;



            public static void main(String[] args) throws Exception {   
                        HttpClient client = new DefaultHttpClient();
                        //args[0] ="http://hostname:port/xyz/zbc";
                        HttpGet request1 = new HttpGet(args[0]);
                        HttpResponse response1 = client.execute(request1);
                        int code = response1.getStatusLine().getStatusCode();

                         try(BufferedReader br = new BufferedReader(new InputStreamReader((response1.getEntity().getContent())));){
                            // Read in all of the post results into a String.
                            String output = "";
                            Boolean keepGoing = true;
                            while (keepGoing) {
                                String currentLine = br.readLine();          
                                if (currentLine == null) {
                                    keepGoing = false;
                                } else {
                                    output += currentLine;
                                }
                            }
                            System.out.println("Response-->"+output);   
                         }

                         catch(Exception e){
                              System.out.println("Exception"+e);  

                          }


                   }
Subhasish Sahu
fuente
Perfecto. Funciona incluso si hay una redirección en la URL
Daniel
2

Esto es lo que funcionó para mí:

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class UrlHelpers {

    public static int getHTTPResponseStatusCode(String u) throws IOException {

        URL url = new URL(u);
        HttpURLConnection http = (HttpURLConnection)url.openConnection();
        return http.getResponseCode();
    }
}

Espero que esto ayude a alguien :)

Jeverick
fuente
2

Pruebe este código que verifica los 400 mensajes de error

huc = (HttpURLConnection)(new URL(url).openConnection());

huc.setRequestMethod("HEAD");

huc.connect();

respCode = huc.getResponseCode();

if(respCode >= 400) {
    System.out.println(url+" is a broken link");
} else {
    System.out.println(url+" is a valid link");
}
Lokesh Sharma
fuente
1

Manera eficiente de obtener datos (con carga útil desigual) por escáner.

public static String getResponseFromHttpUrl(URL url) throws IOException {
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    try {
        InputStream in = urlConnection.getInputStream();

        Scanner scanner = new Scanner(in);
        scanner.useDelimiter("\\A");  // Put entire content to next token string, Converts utf8 to 16, Handles buffering for different width packets

        boolean hasInput = scanner.hasNext();
        if (hasInput) {
            return scanner.next();
        } else {
            return null;
        }
    } finally {
        urlConnection.disconnect();
    }
}
usuario8024555
fuente
Esto no responde a la pregunta en absoluto.
pringi
1

Este es el método estático completo, que puede adaptar para establecer el tiempo de espera y el código de error cuando ocurre IOException:

  public static int getResponseCode(String address) {
    return getResponseCode(address, 404);
  }

  public static int getResponseCode(String address, int defaultValue) {
    try {
      //Logger.getLogger(WebOperations.class.getName()).info("Fetching response code at " + address);
      URL url = new URL(address);
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.setConnectTimeout(1000 * 5); //wait 5 seconds the most
      connection.setReadTimeout(1000 * 5);
      connection.setRequestProperty("User-Agent", "Your Robot Name");
      int responseCode = connection.getResponseCode();
      connection.disconnect();
      return responseCode;
    } catch (IOException ex) {
      Logger.getLogger(WebOperations.class.getName()).log(Level.INFO, "Exception at {0} {1}", new Object[]{address, ex.toString()});
      return defaultValue;
    }
  }
Mladen Adamovic
fuente
0
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestMethod("POST");

. . . . . . .

System.out.println("Value" + connection.getResponseCode());
             System.out.println(connection.getResponseMessage());
             System.out.println("content"+connection.getContent());
neoeahit
fuente
¿Cómo podemos hacer para las URL con autenticación básica?
Satheesh Kumar
0

puede usar la conexión de URL http / https de Java para obtener el código de respuesta del sitio web y otra información. Aquí también hay un código de muestra.

 try {

            url = new URL("https://www.google.com"); // create url object for the given string  
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            if(https_url.startsWith("https")){
                 connection = (HttpsURLConnection) url.openConnection();
            }

            ((HttpURLConnection) connection).setRequestMethod("HEAD");
            connection.setConnectTimeout(50000); //set the timeout
            connection.connect(); //connect
            String responseMessage = connection.getResponseMessage(); //here you get the response message
             responseCode = connection.getResponseCode(); //this is http response code
            System.out.println(obj.getUrl()+" is up. Response Code : " + responseMessage);
            connection.disconnect();`
}catch(Exception e){
e.printStackTrace();
}
captainchhala
fuente
0

Es una pregunta antigua, pero permite mostrar en la forma REST (JAX-RS):

import java.util.Arrays;
import javax.ws.rs.*

(...)

Response response = client
    .target( url )
    .request()
    .get();

// Looking if response is "200", "201" or "202", for example:
if( Arrays.asList( Status.OK, Status.CREATED, Status.ACCEPTED ).contains( response.getStatusInfo() ) ) {
    // lets something...
}

(...)
Thiago Sperandio
fuente