Как получить код ответа HTTP для URL в Java?


144

Пожалуйста, скажите мне шаги или код, чтобы получить код ответа конкретного URL.



2
Я бы не сказал дубликат, так как он хочет получить код ответа, но @Ajit, вы все равно должны это проверить. Добавьте немного экспериментов, и все готово.
slezica

2
Вместо того, чтобы требовать, чтобы другие люди делали вашу работу за вас. Пожалуйста, продемонстрируйте, что вы хотя бы пытались выполнить эту задачу самостоятельно. Покажите свой текущий код и как вы пытались выполнить эту задачу. Если вы хотите, чтобы кто-то выполнял за вас вашу работу без каких-либо усилий с вашей стороны, вы можете нанять кого-нибудь и заплатить ему.
Патрик В. МакМахон

Какое требование он сделал? Он попросил помощи вместо того, чтобы крутить колеса, когда он не знал, что делать. Он использовал сообщество так, как было задумано.
Дэнни Ремингтон - OMS

Ответы:


180

HttpURLConnection :

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

int code = connection.getResponseCode();

Это ни в коем случае не надежный пример; вам нужно справиться IOExceptionс S и еще много чего. Но это должно помочь вам начать.

Если вам нужно что-то с более широкими возможностями, проверьте HttpClient .


2
В моем конкретном случае и с вашим методом я получаю IOException («Не удалось аутентифицироваться через прокси-сервер»), который обычно является ошибкой http 407. Есть ли способ, где я могу получить точность (код ошибки http) относительно возникшего исключения с помощью метода getRespondeCode ()? Кстати, я знаю, как обрабатывать мою ошибку, и я просто хочу знать, как дифференцировать каждое исключение (или, по крайней мере, это конкретное исключение). Спасибо.
grattmandu03

2
@ grattmandu03 - я не уверен. Похоже, вы сталкиваетесь с stackoverflow.com/questions/18900143/… (на который, к сожалению, нет ответа). Вы можете попробовать использовать высокоуровневую инфраструктуру, такую ​​как HttpClient, которая, вероятно, даст вам немного больше контроля над тем, как вы будете обрабатывать подобные ответы.
Роб Хруска

Хорошо, спасибо за ваш ответ. Моя работа состоит в том, чтобы адаптировать старый код для работы с этим прокси, и чем меньше модификаций, тем больше клиент поймет мою работу. Но я думаю, это для меня (прямо сейчас) единственный способ сделать то, что я хочу. Спасибо, в любом случае.
grattmandu03

Вам нужно вызвать disnect () в блоке finally?
Эндрю Свон

Это, вероятно, зависит, я бы сделал некоторые исследования. В документах говорят Вызов disconnect()методы может закрыть сокет , лежащий в основе , если постоянное соединение находится в режиме ожидания в противном случае в то время. , который не гарантирует. Документы также говорят, Указывает, что другие запросы к серверу маловероятны в ближайшем будущем. Вызов disconnect()не должен подразумевать, что этот HttpURLConnectionэкземпляр может быть повторно использован для других запросов. Если вы используете InputStreamдля чтения данных, вы должны close()этот поток в finallyблоке.
Роб Хруска

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

11
+1 для более краткого (но полностью функционального) примера. Хороший пример URL тоже ( фон ) :)
Jonik

получение исключения в потоке "main" java.net.ConnectException: соединение отказано: соединение Я не знаю, почему я получаю это.
Ганеса Виджаякумар

Просто не по теме, я пытаюсь узнать все коды ответов, которые может генерировать соединение - есть ли документ?
Скайнет

Как проверить это для URL с базовой аутентификацией
Satheesh Kumar

плюс один для предложения URL google.com/humans.txt
ПК.

10

Вы можете попробовать следующее:

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

получение исключения в потоке "main" java.net.ConnectException: соединение отказано: соединение. Я не знаю resone
Виджаякумар

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

Это сработало для меня:

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

                          }


                   }

Отлично. Работает, даже если в URL есть перенаправление
Даниил

2

Вот что сработало для меня:

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

Надеюсь, это поможет кому-то :)


2

Попробуйте этот кусок кода, который проверяет 400 сообщений об ошибках

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

Эффективный способ получения данных (с неравномерной нагрузкой) с помощью сканера.

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

Это не отвечает на вопрос вообще.
Принги

1

Это полностью статический метод, который вы можете адаптировать для установки времени ожидания и кода ошибки при возникновении 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());

Как мы можем сделать для URL с базовой аутентификацией?
Сатиш Кумар

0

Вы можете использовать java http / https url connection, чтобы получить код ответа с сайта и другую информацию, а также пример кода.

 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

Это старый вопрос, но позволяет показать в 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...
}

(...)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.