Як отримати код відповіді HTTP для URL-адреси на Java?


144

Скажіть, будь ласка, кроки чи код, щоб отримати код відповіді окремої URL-адреси.



2
Я б не сказав дублювати, оскільки він хоче код відповіді, але @Ajit ви все одно повинні це перевірити. Додайте трохи експериментів, і ви добре підете.
slezica

2
Замість того, щоб вимагати від інших людей робити вашу роботу за вас. Будь ласка, продемонструйте, що ви хоча б намагалися виконати це завдання самостійно. Покажіть свій поточний код і як ви намагалися виконати це завдання. Якщо ви хочете, щоб хтось робив вашу роботу за вас без особливих зусиль, ви можете найняти когось і оплатити їх.
Патрік В. Макмахон

Який попит він зробив? Він попросив допомоги, а не крутив колеса, коли не мав уявлення, що робити. Він використовував громаду так, як було задумано.
Danny Remington - OMS

Відповіді:


180

HttpURLCпідключення :

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

int code = connection.getResponseCode();

Це аж ніяк не є надійним прикладом; вам потрібно буде впоратися з IOExceptions і що. Але це повинно вам почати.

Якщо вам потрібно щось з більш можливостями, перевірте HttpClient .


2
У моєму конкретному випадку та з вашим методом я отримую IOException ("Не вдалося підтвердити автентифікацію за допомогою проксі"), що зазвичай є помилкою http 407. Чи є спосіб отримати точність (код помилки http) щодо винятку методом getRespondeCode ()? До речі, я знаю, як впоратися зі своєю помилкою, і просто хочу знати, як диференціювати кожен виняток (або принаймні цей конкретний виняток). Дякую.
grattmandu03

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

Добре дякую за вашу відповідь. Моя робота - адаптувати старий код для роботи з цим проксі, і менше модифікацій, більше клієнт зрозуміє мою роботу. Але я здогадуюсь, це для мене (зараз) єдиний спосіб робити те, що я хочу. Все одно, дякую.
grattmandu03

Чи потрібно викликати disconnect () в остаточному блоці?
Ендрю Лебідь

Це, мабуть, залежить, я б провів деякі дослідження. У документах говорять Виклик 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

Отримати виняток у "головному" потоці 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();
    }
}

Це зовсім не відповідає на питання.
pringi

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-адреси з базовою автоматизацією?
Satheesh Kumar

0

ви можете використовувати java http / https URL-з'єднання для отримання коду відповіді з веб-сайту та іншої інформації, а також ось зразок коду.

 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.