Wie erhalte ich einen HTTP-Antwortcode für eine URL in Java?

144

Bitte teilen Sie mir die Schritte oder den Code mit, um den Antwortcode einer bestimmten URL zu erhalten.

Ajit
quelle
2
Ich würde nicht doppelt sagen, da er den Antwortcode haben möchte, aber @Ajit, du solltest das trotzdem überprüfen. Wenn Sie ein wenig experimentieren, können Sie loslegen.
Slezica
2
Anstatt von anderen zu verlangen, dass sie Ihre Arbeit für Sie erledigen. Bitte zeigen Sie, dass Sie zumindest versucht haben, diese Aufgabe selbst zu erledigen. Zeigen Sie Ihren aktuellen Code und wie Sie versucht haben, diese Aufgabe auszuführen. Wenn Sie möchten, dass jemand Ihre Arbeit ohne Ihr Zutun für Sie erledigt, können Sie jemanden einstellen und bezahlen.
Patrick W. McMahon
Welche Forderung stellte er? Er bat um Hilfe, anstatt seine Räder zu drehen, wenn er keine Ahnung hatte, was er tun sollte. Er benutzte die Gemeinschaft so, wie es beabsichtigt war.
Danny Remington - OMS

Antworten:

180

HttpURLConnection :

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

int code = connection.getResponseCode();

Dies ist keineswegs ein robustes Beispiel; Sie müssen mit IOExceptions und so weiter umgehen. Aber es sollte Ihnen den Einstieg erleichtern.

Wenn Sie etwas mit mehr Funktionen benötigen, schauen Sie sich HttpClient an .

Rob Hruska
quelle
2
In meinem speziellen Fall und mit Ihrer Methode erhalte ich eine IOException ("Authentifizierung mit Proxy fehlgeschlagen"), bei der es sich normalerweise um einen http-Fehler 407 handelt. Gibt es eine Möglichkeit, eine Genauigkeit (den http-Fehlercode) für die ausgelöste Ausnahme zu erhalten? mit der Methode getRespondeCode ()? Übrigens weiß ich, wie ich mit meinem Fehler umgehen soll, und ich möchte nur wissen, wie ich jede Ausnahme (oder zumindest diese spezielle Ausnahme) unterscheiden kann. Vielen Dank.
grattmandu03
2
@ grattmandu03 - Ich bin nicht sicher. Sieht so aus, als würden Sie auf stackoverflow.com/questions/18900143/… stoßen (was leider keine Antwort hat). Sie könnten versuchen, ein übergeordnetes Framework wie HttpClient zu verwenden, das Ihnen wahrscheinlich ein bisschen mehr Kontrolle darüber gibt, wie Sie mit solchen Antworten umgehen.
Rob Hruska
Ok, danke für deine Antwort. Meine Aufgabe ist es, einen alten Code für die Arbeit mit diesem Proxy anzupassen und weniger Änderungen vorzunehmen, damit der Client meine Arbeit besser versteht. Aber ich denke, es ist für mich (gerade jetzt) ​​der einzige Weg, das zu tun, was ich will. Danke trotzdem.
grattmandu03
Müssen Sie Disconnect () in einem finally-Block aufrufen?
Andrew Swan
Es kommt wahrscheinlich darauf an, ich würde etwas recherchieren. In den Dokumenten heißt es, dass das Aufrufen der disconnect()Methode den zugrunde liegenden Socket schließen kann, wenn zu diesem Zeitpunkt eine dauerhafte Verbindung besteht. , was nicht garantiert. Ärzte sagen auch Zeigt an, dass andere Anfragen an den Server in naher Zukunft unwahrscheinlich sind. Das Aufrufen disconnect()sollte nicht bedeuten, dass diese HttpURLConnectionInstanz für andere Anforderungen wiederverwendet werden kann. Wenn Sie ein InputStreamzum Lesen von Daten verwenden, sollten Sie close()diesen Stream in einem finallyBlock verwenden.
Rob Hruska
38
URL url = new URL("http://www.google.com/humans.txt");
HttpURLConnection http = (HttpURLConnection)url.openConnection();
int statusCode = http.getResponseCode();
kwo
quelle
11
+1 für ein prägnanteres (aber voll funktionsfähiges) Beispiel. Schöne Beispiel-URL auch ( Hintergrund ) :)
Jonik
Ausnahme im Thread "main" abrufen java.net.ConnectException: Verbindung abgelehnt: Verbindung Ich weiß nicht, warum ich diese bekomme.
Ganesa Vijayakumar
Ich versuche, alle Antwortcodes zu kennen, die eine Verbindung generieren kann. Gibt es ein Dokument?
Skynet
So überprüfen Sie dies auf URLs mit Basisauthentifizierung
Satheesh Kumar
plus eine für den Vorschlag der URL google.com/humans.txt
PC.
10

Sie könnten Folgendes versuchen:

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
quelle
Ausnahme im Thread "main" abrufen java.net.ConnectException: Verbindung abgelehnt: Verbindung. Ich kenne den Resone nicht
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
quelle
4

Das hat bei mir funktioniert:

            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
quelle
Perfekt. Funktioniert auch, wenn es eine Umleitung in der URL gibt
Daniel
2

Das hat bei mir funktioniert:

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

Hoffe das hilft jemandem :)

Jeverick
quelle
2

Probieren Sie diesen Code aus, der die 400 Fehlermeldungen überprüft

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
quelle
1

Effizienter Weg, um Daten (mit ungleichmäßiger Nutzlast) per Scanner abzurufen.

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
quelle
Dies beantwortet die Frage überhaupt nicht.
Pringi
1

Dies ist die vollständige statische Methode, die Sie anpassen können, um die Wartezeit und den Fehlercode festzulegen, wenn eine IOException auftritt:

  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
quelle
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
quelle
Wie können wir für URLs mit Standardauthentifizierung vorgehen?
Satheesh Kumar
0

Sie können die Java http / https-URL-Verbindung verwenden, um den Antwortcode von der Website und andere Informationen abzurufen. Hier ist ein Beispielcode.

 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
quelle
0

Es ist eine alte Frage, aber lassen Sie uns auf REST-Weise zeigen (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
quelle