HttpURLConnection获取重定向目标的URL

起因:客户给了一个外网图片路径,需要将外网图片上传到对象存储中,但是发现上传到对象存储中了,但是下载下来的图片是破损的。

原因:在请求图片服务器端时,服务器将 HTTP 请求转发成了 HTTPS请求导致的

处理方法:当 HTTP 响应返回状态码为 3xx 重定向时,服务器通常会在响应头中包含 "Location" 字段,指示客户端应该重定向到的新的URL地址。通过调用 getHeaderField("Location") 方法,您可以获取这个重定向目标的URL。

代码如下:

URL url = null;
HttpURLConnection connection = null;
try {
    url = new URL("http://img.test.com/test.jpg");
    //获取URL链接
    connection = (HttpURLConnection) url.openConnection();
    //获取HTTP响应的状态码
    int statusCode = connection.getResponseCode();
    //HTTP请求的状态 200:成功,404:找不到资源等
    //重定向状态码时,获取重定向目标的URL
    if (statusCode >= 300 && statusCode < 400) {
        String redirectUrl = connection.getHeaderField("Location");
        if (redirectUrl != null) {
            url = new URL(redirectUrl);
            connection = (HttpURLConnection) url.openConnection();
        }
    }
    // 获取HTTP响应的内容长度
    long fileSize = connection.getContentLengthLong();
    try (InputStream inputStream = connection.getInputStream()) {
        //文件处理
        ......
        //断开连接并释放相关资源
        connection.disconnect();
    } catch (IOException e) {
        throw new CofcoBootException("文件流上传出现异常", e);
    }
} catch (IOException e) {
    throw new CofcoBootException("url上传异常", e);
} finally {
    if (connection != null) {
        //断开连接并释放相关资源
        connection.disconnect();
    }
}

HTTP 协议定义了一系列状态码来表示请求的处理结果。以下是一些常见的 HTTP 状态码及其对应的含义:

  • 1xx:信息性状态码,表示请求已被接收并继续处理。

    • 100:Continue
    • 101:Switching Protocols
  • 2xx:成功状态码,表示服务器成功接收、理解和处理请求。

    • 200:OK
    • 201:Created
    • 202:Accepted
    • 204:No Content
  • 3xx:重定向状态码,表示需要进一步操作才能完成请求。

    • 301:Moved Permanently
    • 302:Found
    • 304:Not Modified
    • 307:Temporary Redirect
  • 4xx:客户端错误状态码,表示发出的请求有错误或无法完成。

    • 400:Bad Request
    • 401:Unauthorized
    • 403:Forbidden
    • 404:Not Found
    • 405:Method Not Allowed
    • 429:Too Many Requests
  • 5xx:服务器错误状态码,表示服务器在处理请求时发生错误。

    • 500:Internal Server Error
    • 502:Bad Gateway
    • 503:Service Unavailable
    • 504:Gateway Timeout

这只是一些常见的状态码示例,HTTP 协议还定义了其他状态码用于特定的情况。每个状态码都有其特定的含义和用途,您可以根据实际情况对它们进行处理和解读。

请注意,在使用 HttpURLConnection 或其他相关库进行 HTTP 请求时,可以根据返回的状态码来判断请求的结果,并根据需要采取相应的处理措施。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值