Come ottenere il codice di risposta HTTP per un URL in Java?


144

Per favore dimmi i passaggi o il codice per ottenere il codice di risposta di un URL particolare.



2
Non direi duplicato, poiché vuole il codice di risposta, ma @Ajit dovresti comunque verificarlo. Aggiungi un po 'di sperimentazione e sei a posto.
slezica,

2
Piuttosto che richiedere ad altre persone di fare il tuo lavoro per te. Dimostrare di aver almeno tentato di eseguire questo compito da soli. Mostra il tuo codice attuale e come hai tentato di eseguire questa attività. Se vuoi che qualcuno faccia il tuo lavoro per te senza alcuno sforzo da parte tua, puoi assumere qualcuno e pagarlo.
Patrick W. McMahon,

Quale richiesta ha fatto? Chiese aiuto, invece di girare le ruote quando non aveva idea di cosa fare. Stava usando la comunità come previsto.
Danny Remington - OMS,

Risposte:


180

HttpURLConnection :

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

int code = connection.getResponseCode();

Questo non è affatto un valido esempio; dovrai gestire se IOExceptionno. Ma dovrebbe iniziare.

Se hai bisogno di qualcosa con più funzionalità, dai un'occhiata a HttpClient .


2
Nel mio caso specifico e con il tuo metodo, ottengo una IOException ("Impossibile eseguire l'autenticazione con proxy") che di solito è un errore http 407. Esiste un modo per ottenere una precisione (il codice di errore http) sull'eccezione sollevata con il metodo getRespondeCode ()? A proposito, so come gestire il mio errore e voglio solo sapere come differenziare ogni eccezione (o almeno questa specifica eccezione). Grazie.
grattmandu03,

2
@ grattmandu03 - Non ne sono sicuro. Sembra che tu stia incontrando stackoverflow.com/questions/18900143/… (che purtroppo non ha una risposta). Potresti provare a utilizzare un framework di livello superiore come HttpClient, che probabilmente ti darebbe un po 'più di controllo su come gestisci le risposte in questo modo.
Rob Hruska,

Ok grazie per la tua risposta. Il mio compito è quello di adattare un vecchio codice per lavorare con questo proxy e meno modifiche più il cliente capirà il mio lavoro. Ma immagino, è per me (in questo momento) l'unico modo per fare quello che voglio. Grazie comunque.
grattmandu03,

Devi chiamare disconnect () in un blocco finally?
Andrew Swan,

Probabilmente dipende, farei qualche ricerca. I documenti dicono che la chiamata al disconnect()metodo può chiudere il socket sottostante se una connessione persistente è inattiva in quel momento. , che non garantisce. I documenti dicono anche Indica che altre richieste al server sono improbabili nel prossimo futuro. La chiamata disconnect()non dovrebbe implicare che questa HttpURLConnectionistanza possa essere riutilizzata per altre richieste. Se stai utilizzando un InputStreamper leggere i dati, dovresti close()eseguire lo streaming in un finallyblocco.
Rob Hruska,

38
URL url = new URL("http://www.google.com/humans.txt");
HttpURLConnection http = (HttpURLConnection)url.openConnection();
int statusCode = http.getResponseCode();

11
+1 per un esempio più conciso (ma pienamente funzionale).
Bell'esempio di

ottenere l'eccezione nel thread "principale" java.net.ConnectException: connessione rifiutata: connettersi Non so perché la ottengo.
Ganesa Vijayakumar,

Appena fuori argomento, sto cercando di conoscere tutti i codici di risposta che una connessione può generare: esiste un documento?
Skynet,

Come controllare questo per gli URL con autenticazione di base
Satheesh Kumar

più uno per suggerire l'URL google.com/humans.txt
PC.

10

Puoi provare quanto segue:

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");
        }
    }
}

ottenere l'eccezione nel thread "principale" java.net.ConnectException: connessione rifiutata: connessione. Non conosco la risonanza
Ganesa Vijayakumar il

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);
    }
}

4

Questo ha funzionato per me :

            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);  

                          }


                   }

Perfetto. Funziona anche se nell'URL è presente un reindirizzamento
Daniel,

2

Questo è ciò che ha funzionato per me:

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();
    }
}

Spero che questo aiuti qualcuno :)


2

Prova questo pezzo di codice che sta controllando i 400 messaggi di errore

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");
}

1

Modo efficiente per ottenere dati (con carico utile irregolare) dallo scanner.

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();
    }
}

Questo non risponde affatto alla domanda.
pringi,

1

Questo è il metodo statico completo, che è possibile adattare per impostare il tempo di attesa e il codice di errore quando si verifica 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;
    }
  }

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());

Come possiamo fare per gli URL con autenticazione di base?
Satheesh Kumar

0

è possibile utilizzare la connessione URL http / https java per ottenere il codice di risposta dal sito Web e altre informazioni. Ecco un codice di esempio.

 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();
}

0

È una vecchia domanda, ma consente di mostrare in modo 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...
}

(...)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.