当前位置: 首页 > 知识库问答 >
问题:

从java中提取HTTP状态代码。伊奥。IOException

钦德佑
2023-03-14

如何从java获取HTTP状态代码(如果有的话)。伊奥。java中的IOException

共有1个答案

晏阳飙
2023-03-14

我假设这是关于URLConnection引发的IOException

根据你的限制,有三种可能处理这个问题。

1)将您的URLConnection转换为HttpURLConnection并调用get响应代码

如果您有权访问连接对象,您可以使用此代码获取状态代码:

int statusCode = (HttpURLConnection)theConnection).getResponseCode();

2) 首先使用HttpURLConnection而不是URLConnection

如果您可以做到这一点,这将是最好的解决方案,因为URLConnection不会抛出错误状态代码。您只需调用get响应代码并检查状态,而不会首先获得任何异常。

3) 解析异常消息本身

IOException的消息通常如下所示:

Server returned HTTP response code: 403 for URL: http://something

因此,您可以使用正则表达式(或简单的字符串操作)来获取响应代码。

请注意,对于状态404,消息与此不同,并引发FileNotFoundException。我不确定是否有其他状态码抛出类似的“特殊”异常,但请注意这一点。

示例代码演示方法2

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class HelloWorld {
    public static void testUrl(String urlString) throws MalformedURLException {
        URLConnection conn = null;
        System.out.println("Testing URL " + urlString);
        try {
            URL url = new URL(urlString);
            conn = url.openConnection();

            // Just to make the exception happen
            conn.getInputStream();

            System.out.println("Success!");
        } catch(IOException ex) {
            System.out.println("Error!");
            System.out.println();

            // Method 2 with access to the URLConnection object
            // (Method 1 would have been having the connection as HttpURLConnection from the beginning.)
            int responseCode = 0;
            System.out.println("Trying method 2 to get status code");

            try {
                if(conn != null) {
                    // Casting to HttpURLConnection allows calling getResponseCode
                    responseCode = ((HttpURLConnection)conn).getResponseCode();
                } else {
                    System.out.println("conn variable not set");
                }
            } catch(IOException ex2) {
                System.out.println("getResponseCode threw: " + ex2);
            }

            System.out.println("Status code from calling getResponseCode: " + responseCode);
            System.out.println();

            // Method 3 without access to the URLConnection object
            responseCode = 0;
            System.out.println("Trying method 3 to get status code");

            // First we try parsing the exception message to see if it contains the response code
            Matcher exMsgStatusCodeMatcher = Pattern.compile("^Server returned HTTP response code: (\\d+)").matcher(ex.getMessage());
            if(exMsgStatusCodeMatcher.find()) {
                responseCode = Integer.parseInt(exMsgStatusCodeMatcher.group(1));
            } else if(ex.getClass().getSimpleName().equals("FileNotFoundException")) {
                // 404 is a special case because it will throw a FileNotFoundException instead of having "404" in the message
                System.out.println("Got a FileNotFoundException");
                responseCode = 404;
            } else {
                // There can be other types of exceptions not handled here
                System.out.println("Exception (" + ex.getClass().getSimpleName() + ") doesn't contain status code: " + ex);
            }

            System.out.println("Status code from parsing exception message: " + responseCode);
            System.out.println();
        }

        System.out.println("-------");
        System.out.println();
    }

    public static void main(String []args) throws MalformedURLException {
        testUrl("https://httpbin.org/status/200");
        testUrl("https://httpbin.org/status/404");
        testUrl("https://httpbin.org/status/403");
        testUrl("http://nonexistingsite1111111.com");
    }
}

示例代码的输出:

Testing URL https://httpbin.org/status/200                                                                                                                                                                                        
Success!                                                                                                                                                                                                                          
-------                                                                                                                                                                                                                           

Testing URL https://httpbin.org/status/404                                                                                                                                                                                        
Error!                                                                                                                                                                                                                            

Trying method 2 to get status code                                                                                                                                                                                                
Status code from calling getResponseCode: 404                                                                                                                                                                                     

Trying method 3 to get status code                                                                                                                                                                                                
Got a FileNotFoundException                                                                                                                                                                                                       
Status code from parsing exception message: 404                                                                                                                                                                                   

-------

Testing URL https://httpbin.org/status/403                                                                                                                                                                                        
Error!                                                                                                                                                                                                                            

Trying method 2 to get status code                                                                                                                                                                                                
Status code from calling getResponseCode: 403                                                                                                                                                                                     

Trying method 3 to get status code                                                                                                                                                                                                
Status code from parsing exception message: 403                                                                                                                                                                                   

-------

Testing URL http://nonexistingsite1111111.com                                                                                                                                                                                     
Error!                                                                                                                                                                                                                            

Trying method 2 to get status code                                                                                                                                                                                                
getResponseCode threw: java.net.UnknownHostException: nonexistingsite1111111.com                                                                                                                                                  
Status code from calling getResponseCode: 0                                                                                                                                                                                       

Trying method 3 to get status code                                                                                                                                                                                                
Exception (UnknownHostException) doesn't contain status code: java.net.UnknownHostException: nonexistingsite1111111.com                                                                                                           
Status code from parsing exception message: 0                                                                                                                                                                                     

-------                                                                                                                                                                                                                           
 类似资料:
  • 如何从的结果中获取HTTP状态?

  • 问题内容: 我正在使用HTTP调用我们的服务,该服务返回一个简单的JSON响应。我根本不需要解析该JSON。我只需要退还从该服务中获得的收益。 所以我将其映射到并以字符串形式返回实际值。 现在的问题是- 我想在点击URL后提取。如何从上述代码中提取HTTP状态代码?我是否需要以目前的方式对此进行任何更改? 更新:- 这是我尝试过的方法,我也可以获取响应和状态代码。但是我是否总是需要像下面这样设置和

  • 我使用对我们的服务进行HTTP调用,它返回一个简单的JSON响应。我根本不需要解析那个JSON。我只需要把我从那次服务中得到的东西退回来。 我试图在访问URL后提取。如何从上面的代码中提取HTTP状态代码?我需要对我目前做的方式做任何改变吗? 更新:- 这是我已经尝试过的,我能够得到回复和状态代码以及。但是,我是否总是需要像下面这样设置和对象呢? 几个问题-我需要吗?我只是调用url返回一个响应,

  • 这可能看起来很愚蠢,但是我试图在Axios中请求失败时获取错误数据。 是否可以获取一个可能包含状态代码和内容的对象,而不是字符串?例如:

  • 问题内容: 我现在将脚本更改为jquery。这是我的旧javascript: 我现在想将其更改为jquery-ajax: 像在旧脚本中一样,如何测试请求返回的状态码(和responseText)? 问题答案: 试试这个: 要么:

  • 我是Spring Reactive framework的新手&正在尝试将SpringBoot1.5.x代码转换为SpringBoot2.0。我需要从Spring5WebClient ClientResponse返回一些过滤后的响应头、主体和状态代码。我不想使用block()方法,因为它会将其转换为同步调用。我可以很容易地使用BodyTomono获得responsebody。此外,如果我只是返回Cl