Jak uzyskać kod odpowiedzi HTTP dla adresu URL w Javie?

144

Podaj kroki lub kod, aby uzyskać kod odpowiedzi dla konkretnego adresu URL.

Ajit
źródło
2
Nie powiedziałbym, że duplikat, ponieważ chce kodu odpowiedzi, ale @Ajit i tak powinieneś to sprawdzić. Dodaj trochę eksperymentów i gotowe.
Slezica
2
Zamiast żądać od innych ludzi pracy za Ciebie. Proszę wykazać, że przynajmniej próbowałeś wykonać to zadanie samodzielnie. Pokaż swój aktualny kod i sposób, w jaki próbowałeś wykonać to zadanie. Jeśli chcesz, aby ktoś wykonywał za Ciebie pracę bez wysiłku z Twojej strony, możesz kogoś zatrudnić i zapłacić.
Patrick W. McMahon
Jakie zgłosił żądanie? Poprosił o pomoc, zamiast kręcić kołami, kiedy nie miał pojęcia, co robić. Korzystał ze społeczności zgodnie z przeznaczeniem.
Danny Remington - OMS

Odpowiedzi:

180

HttpURLConnection :

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

int code = connection.getResponseCode();

Nie jest to bynajmniej solidny przykład; będziesz musiał sobie z tym poradzić IOException. Ale to powinno dać ci początek.

Jeśli potrzebujesz czegoś z większymi możliwościami, sprawdź HttpClient .

Rob Hruska
źródło
2
W moim konkretnym przypadku iz Twoją metodą otrzymuję wyjątek IOException („Failed to authentication with proxy”), który zwykle jest błędem http 407. Czy istnieje sposób, w jaki mogę uzyskać dokładność (kod błędu http) dotyczącą zgłoszonego wyjątku przez metodę getRespondeCode ()? Nawiasem mówiąc, wiem, jak poradzić sobie z moim błędem, i chcę tylko wiedzieć, jak rozróżnić każdy wyjątek (lub przynajmniej ten konkretny wyjątek). Dzięki.
grattmandu03
2
@ grattmandu03 - Nie jestem pewien. Wygląda na to, że natrafisz na stackoverflow.com/questions/18900143/… (co niestety nie ma odpowiedzi). Możesz spróbować użyć struktury wyższego poziomu, takiej jak HttpClient, która prawdopodobnie zapewni Ci nieco większą kontrolę nad sposobem obsługi takich odpowiedzi.
Rob Hruska
Ok, dziękuję za odpowiedź. Moim zadaniem jest przystosowanie starego kodu do pracy z tym proxy, a mniej modyfikacji tym bardziej klient zrozumie moją pracę. Ale myślę, że to dla mnie (teraz) jedyny sposób na robienie tego, co chcę. W każdym razie dzięki.
grattmandu03
Czy musisz wywołać rozłączenie () w końcu bloku?
Andrew Swan
To prawdopodobnie zależy, zrobiłbym pewne badania. W docs powiedzieć Wywołanie disconnect()metody mogą zamknąć gniazdo bazowych, jeżeli trwałe połączenie jest bezczynny w tym czasie. , co nie gwarantuje. Dokumenty mówią również Wskazuje, że inne żądania do serwera są mało prawdopodobne w najbliższej przyszłości. Wywołanie disconnect()nie powinno oznaczać, że ta HttpURLConnectioninstancja może zostać ponownie wykorzystana do innych żądań. Jeśli używasz InputStreamdo odczytywania danych, powinieneś close()ten strumień w finallybloku.
Rob Hruska
38
URL url = new URL("http://www.google.com/humans.txt");
HttpURLConnection http = (HttpURLConnection)url.openConnection();
int statusCode = http.getResponseCode();
kwo
źródło
11
+1 za bardziej zwięzły (ale w pełni funkcjonalny) przykład. Ładny przykładowy adres URL (w tle ) :)
Jonik
uzyskiwanie wyjątku w wątku „main” java.net.ConnectException: Odmowa połączenia: połączenie Nie wiem, dlaczego to dostaję.
Ganesa Vijayakumar
Zaraz poza tematem, próbuję poznać wszystkie kody odpowiedzi, które może wygenerować połączenie - czy jest dokument?
Skynet
Jak to sprawdzić w przypadku adresów URL z podstawowym uwierzytelnianiem
Satheesh Kumar
plus jeden za sugerowanie adresu URL google.com/humans.txt
PC.
10

Możesz spróbować następujących rzeczy:

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
źródło
pobieranie wyjątku w wątku „main” java.net.ConnectException: Odmowa połączenia: połączenie. Nie znam rezonu
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
źródło
4

To zadziałało dla mnie:

            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
źródło
Idealny. Działa, nawet jeśli w adresie URL jest przekierowanie
Daniel
2

Oto, co zadziałało dla mnie:

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

Mam nadzieję, że to komuś pomoże :)

Jeverick
źródło
2

Wypróbuj ten fragment kodu, który sprawdza 400 komunikatów o błędach

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
źródło
1

Efektywny sposób pobierania danych (przy nierównomiernym obciążeniu) przez skaner.

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();
    }
}
user8024555
źródło
To wcale nie odpowiada na pytanie.
pringi
1

Jest to pełna metoda statyczna, którą można dostosować, aby ustawić czas oczekiwania i kod błędu, gdy wystąpi wyjątek 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
źródło
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
źródło
Jak możemy zrobić dla adresów URL z uwierzytelnianiem podstawowym?
Satheesh Kumar
0

możesz użyć połączenia Java http / https url, aby uzyskać kod odpowiedzi ze strony internetowej i inne informacje, a także tutaj jest przykładowy kod.

 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
źródło
0

To stare pytanie, ale pokażemy w 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
źródło