วิธีรับรหัสตอบกลับ HTTP สำหรับ URL ใน Java


144

โปรดบอกขั้นตอนหรือรหัสเพื่อรับรหัสการตอบสนองของ URL แบบกระจาย



2
ฉันจะไม่พูดซ้ำเพราะเขาต้องการรหัสการตอบสนอง แต่ @Ajit คุณควรตรวจสอบว่าต่อไป เพิ่มการทดลองเพียงเล็กน้อยแล้วคุณก็ไปได้ดี
slezica

2
แทนที่จะเรียกร้องให้คนอื่นทำงานเพื่อคุณ โปรดแสดงให้เห็นว่าอย่างน้อยคุณก็พยายามทำภารกิจนี้ให้สำเร็จด้วยตนเอง แสดงรหัสปัจจุบันของคุณและวิธีที่คุณพยายามทำภารกิจนี้ให้สำเร็จ หากคุณต้องการให้คนทำงานให้คุณโดยไม่ต้องใช้ความพยายามคุณสามารถจ้างคนและจ่ายให้
Patrick W. McMahon

เขาต้องการอะไร เขาขอความช่วยเหลือแทนที่จะหมุนล้อเมื่อเขาไม่รู้ว่าจะทำอย่างไร เขาใช้ชุมชนตามที่ตั้งใจไว้
Danny Remington - 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อะไร แต่ควรให้คุณเริ่มต้น

ถ้าคุณต้องการบางสิ่งบางอย่างที่มีความสามารถมากขึ้นตรวจสอบHttpClient


2
ในกรณีเฉพาะของฉันและด้วยวิธีการของฉันฉันได้รับ IOException ("ล้มเหลวในการตรวจสอบกับพร็อกซี") ซึ่งมักจะเป็นข้อผิดพลาด http 407 มีวิธีที่ฉันสามารถได้รับความแม่นยำ (รหัสข้อผิดพลาด http) เกี่ยวกับข้อยกเว้น โดยวิธี getRespondeCode ()? โดยวิธีการที่ฉันรู้วิธีจัดการข้อผิดพลาดของฉันและฉันต้องการทราบวิธีการแยกข้อยกเว้นแต่ละข้อ (หรืออย่างน้อยข้อยกเว้นเฉพาะนี้) ขอบคุณ
grattmandu03

2
@ grattmandu03 - ฉันไม่แน่ใจ ดูเหมือนว่าคุณกำลังใช้งานstackoverflow.com/questions/18900143/… (ซึ่งน่าเสียดายที่ไม่มีคำตอบ) คุณสามารถลองใช้เฟรมเวิร์กระดับสูงกว่าเช่น HttpClient ซึ่งอาจช่วยให้คุณควบคุมวิธีจัดการกับการตอบสนองได้มากกว่านี้อีกเล็กน้อย
Rob Hruska

ตกลงขอบคุณสำหรับคำตอบของคุณ งานของฉันคือการดัดแปลงรหัสเก่าเพื่อทำงานกับพร็อกซีนี้และการปรับเปลี่ยนที่น้อยลงลูกค้าจะเข้าใจงานของฉันมากขึ้น แต่ฉันเดาว่ามันสำหรับฉัน (ตอนนี้) วิธีเดียวที่จะทำสิ่งที่ฉันต้องการ ขอบคุณอยู่ดี
grattmandu03

คุณจำเป็นต้องโทรออก () ในที่สุดบล็อก?
แอนดรูสวอน

อาจขึ้นอยู่กับว่าฉันจะทำวิจัย เอกสารบอกว่าเรียกdisconnect()วิธีการอาจจะปิดซ็อกเก็ตพื้นฐานถ้าเชื่อมต่อแบบถาวรเป็นอย่างอื่นไม่ได้ใช้งานในช่วงเวลานั้น ซึ่งไม่รับประกัน เอกสารยังระบุด้วยว่าการร้องขออื่น ๆ ไปยังเซิร์ฟเวอร์ไม่น่าจะเกิดขึ้นในอนาคตอันใกล้ การโทรdisconnect()ไม่ควรบอกเป็นนัยว่าHttpURLConnectionอินสแตนซ์นี้สามารถนำมาใช้ซ้ำสำหรับคำขออื่น ๆ ได้ หากคุณกำลังใช้การInputStreamอ่านข้อมูลคุณควรclose()สตรีมนั้นในfinallyบล็อก
Rob Hruska

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: การเชื่อมต่อถูกปฏิเสธ: เชื่อมต่อฉันไม่รู้ว่าทำไมฉันถึงได้รับสิ่งนี้
Ganesa Vijayakumar

เพิ่งปิดหัวข้อฉันพยายามที่จะรู้ว่ารหัสการตอบสนองทั้งหมดที่การเชื่อมต่อสามารถสร้าง - มีเอกสารหรือไม่?
Skynet

วิธีตรวจสอบ 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: การเชื่อมต่อถูกปฏิเสธ: เชื่อมต่อ ฉันไม่รู้จักการแก้ไข
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);
    }
}

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
Daniel

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

คุณสามารถใช้การเชื่อมต่อ URL http / https ของ java เพื่อรับรหัสการตอบสนองจากเว็บไซต์และข้อมูลอื่น ๆ เช่นกันนี่คือตัวอย่างรหัส

 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...
}

(...)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.