[Java SE] 核心源码精讲:java.net.URLConnection

news/2024/12/28 10:57:08/文章来源:https://www.cnblogs.com/johnnyzen/p/18637267

概述: URLConnection

  • URLConnection是一个抽象类,表示指向URL【指定资源】的活动连接
  • URLConnection可以检查服务器发送的首部,并相应地做出响应。
  • 它可以设置客户端请求中使用的首部字段。
  • URLConnection可以用POST、PUT和其他HTTP请求方法向服务器发回数据;
  • URLConnection类是Java协议处理器机制的一部分

URLConnection 的7种URL协议实现

  • URL对象通过openConnection()可以获得的URLConnection的子类实现的连接对象

  • URL对象支持7种协议————子类实现:

  • FileURLConnection
  • FtpURLConnection
  • HttpURLConnection
  • HttpsURLConnection
  • JarURLConnection
  • MailToURLConnection

这几种连接对象,都在包sun.net.www.protocol包下面。

区别: URL vs. URLConnection

  • URL和URLConnection这两个类最大的不同在于:
  • URLConnection提供了对HTTP首部的访问;
  • URLConnection可以配置发送给服务器的请求参数;
  • URLConnection除了读取服务器数据外,还可以向服务器写入数据;

打开 URLConnection : openConnection()

  • 直接使用URLConnection类的程序遵循以下基本步骤:
  • 构造一个URL对象;
  • 调用这个URL对象的openConnection()获取一个对应该URL的URLConnection对象;
  • 配置这个URLConnection;
  • 读取首部字段;
  • 获得输入流并读取数据;
  • 获得输出流并写入数据;
  • 关闭连接;

注:并不一定执行所有这些步骤。看你需不需要!

  • URLConnection类仅有的一个构造函数protected类型:
protected URLConnection(URL url)
    String urlPath = "http://www.baidu.com"; //"file://d:/xx/yy/demo.txt" , "ftp://dd/gg/jh/demo.txt"
try {URL url = new URL(urlPaht);URLConnection connection = url.openConnection();//从URL读取...
} catch (Exception e) {// TODO: handle exception
}

读取服务器的数据

  • 下面是使用URLConnection对象从一个URL获取数据所需的最起码的步骤:
  • 构造一个URL对象;
  • 调用这个URL对象的openConnection()方法,获取对应该该URL的URLConnection对象;
  • 调用这个URLConnection的getInputStream()方法;
  • 使用通常的流API读取输入流;
  • getInputStream()方法返回一个通用InputStream,可以读取和解析服务器发送的数据:
public class Test {public static void main(String[] args) {try {//打开URLConnection进行读取URL url = new URL("http://www.baidu.com");URLConnection connection = url.openConnection();try (InputStream in = connection.getInputStream()){    //带资源的try-catch语句,自动关闭InputStream buffer = new BufferedInputStream(in);//将InputStream串链到一个ReaderReader reader = new InputStreamReader(buffer);int c;while ((c = reader.read())!= -1) {System.out.print((char)c);}} catch (MalformedURLException e) {}} catch (IOException e) {}}	
}

读取指定的首部字段

  • 可以获取请求首部中特定的常用字段的方法:
  • Content-Type
  • Content-Length
  • Content-encoding
  • Date
  • Last-modified
  • Expires

public String getContentType()

  • getContentType()

返回响应主体的MIME内容类型。如果没有提供内容类型,它不会抛出异常,而是返回null;

public int getContentLength()

  • getContentLength()

告诉你内容中有多少字节。如果没有Content-Length首部,getContentLength()就返回-1;

public long getContentLengthLong()

Java7增加的
与getContentLength()类似,只不过它会返回一个long而不是int,这样就可以处理更大的资源;

public String getContentEncoding()

  • getContentEncoding()

返回一个String,指出内容是如何编码的。如果发送的内容没有编码,这个方法就返回null;

public long getDate()

  • getDate()方法

返回一个long,指出文档何时发送;

public long getExpiration()

  • 有些文档有基于服务器的过期日期,指示应当何时从缓存中删除文档,并从服务器重新下载。

  • 如果HTTP首部没有包括Expiration字段,getExpiration()就返回0,这表示文档不会过期,将永远保留在缓存中;

public long getLastModified()

返回文档的最后修改日期;

Test .java

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;public class Test {public static void main(String[] args) {try {URL url = new URL("http://www.baidu.com");URLConnection connection = url.openConnection();System.out.println("Content-Type: " + connection.getContentType());System.out.println("Content-Length: " + connection.getContentLength());System.out.println("Content-LengthLong: " + connection.getContentLengthLong());System.out.println("Content-encoding: " + connection.getContentEncoding());System.out.println("Date: " + connection.getDate());System.out.println("Expires: " + connection.getExpiration());System.out.println("Last-modified: " + connection.getLastModified());} catch (IOException e) {throw new RuntimeException(e);}}
}

out.log

Content-Type: text/html
Content-Length: 2381
Content-LengthLong: 2381
Content-encoding: null
Date: 1735307608000
Expires: 0
Last-modified: 0

获取任意首部字段

public String getHeaderField(String name)

  • getHeaderField()

返回指定首部字段的值。首部的名不区分大小写,也不包含结束冒号;

URL url = new URL("http://www.baidu.com");
URLConnection connection = url.openConnection();
System.out.println(connection.getHeaderField("Content-Type"));
System.out.println(connection.getHeaderField("last-modified"));//输出
text/html
Mon, 23 Jan 2017 13:27:36 GMT

public String getHeaderFieldKey(int n)

  • getHeaderFieldKey(int n)

返回第n个首部字段的键(即字段名)。请求方法本身是第0个首部,它的键为null。第一个首部即编号为1

System.out.println(connection.getHeaderFieldKey(5));    //输出Content-Type

public String getHeaderField(int n)

返回第n个首部字段的值,包含请求方法和路径的起始行是第0个首部字段,实际的第一个首部编号为1

Test.java : 循环显示整个HTTP首部

public class Test {public static void main(String[] args) {try {URL url = new URL("http://www.baidu.com");URLConnection connection = url.openConnection();for (int i = 1; ; i++) {String header = connection.getHeaderField(i);if (header == null) {break;}System.out.println(connection.getHeaderFieldKey(i)+": "+header);	}} catch (IOException e) {}}	
}//输出
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2381
Content-Type: text/html
Date: Thu, 04 Oct 2018 13:14:20 GMT
Etag: "588604ec-94d"
Last-Modified: Mon, 23 Jan 2017 13:28:12 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/

public long getHeaderFieldDate(String name, long Default)

这个方法首先获取由name参数指定的首部字段,然后尝试将这个字符串转换为一个long;

public long getHeaderFieldInt(String name, int Default)

这个方法获取首部字段name的值,尝试将其转换为int;

X 推荐文献

  • [Java SE/JDK/网络] 核心源码精讲:java.net.HttpURLConnection - 博客园/千千寰宇
  • [Java SE] Java-文件系统-常用文件路径的获取方法 - 博客园/千千寰宇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860311.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中考英语优秀范文-001 How to Eat in a Healthy Way 怎样健康饮食

中考英语优秀范文-001 How to Eat in a Healthy Way 怎样健康饮食 1 写作要求 假设你叫李华,你们市将要举行以 “How to Eat in a Healthy Way” 为题的演讲比赛,请你准备写一篇演讲稿,内容包括: 说明此次演讲的主题 (how to eat in a healthy way); 我们应该少吃、不吃及…

2024-12-28 AI智能体日报

大家好,我是疯狂老包。专注于智能体开发与教学,《100个扣子实战案例持续更新中》。作者:疯狂老包,转载请注明原文链接:https://www.cnblogs.com/laobao1756435/p/18637255

AI日报

大家好,我是疯狂老包。专注于智能体开发与教学,《100个扣子实战案例持续更新中》。作者:疯狂老包,转载请注明原文链接:https://www.cnblogs.com/laobao1756435/p/18637255

AD批量更改PCB丝印位置

第一步:选中要排列字符的元件第二步: “A”—>“定位器文本(P)”—>选择标识符位置进行修改:结果:

Idea、pycharm初始化设置

IDEA、pycharm配置,下文真对IDEA设置,pycharm可参考 5. 详细设置 5.1 如何打开详细配置界面 1.显示工具栏 2、选择详细配置菜单或按钮 5.2 系统设置 1、默认启动项目配置 启动IDEA时,默认自动打开上次开发的项目?还是自己选择? 如果去掉Reopen projects on startup前面的…

CF补题 981-Div.3

CF补题 981-Div.3-20241226 Dashboard - Codeforces Round 981 (Div. 3) - Codeforces A: 题目大意:\(x\) 从 \(0\) 开始,轮流将 \(x\) 前后移动 \(i*2-1\), 求最后移动出 $-n,n $ 的 $ i$ #include <iostream> #include <math.h> using namespace std;int mai…

vue项目中使用swiper轮播

安装swipernpm install swiper@4 --save -dev npm install vue-awesome-swiper@3 --save-dev使用swiper<template><div class="swiper-container"><swiper :options="swiperOption"><swiper-slide v-for="(slide, index) in sli…

蓝牙配对弹框默认允许关闭

蓝牙配对的时候,会有个以下的弹框,客户需求是不需要人为去点击,默认允许配对 实际处理弹框配对的是BluetoothPairingController.java BluetoothPairingRequest.java这个文件主要负责处理配对弹框的广播申请,直接去掉那些流程,确认配对即可--- a/src/com/android/setting…

使用html5实现图片随手机重力感应而移动

在前端开发中,实现图片随手机重力感应而移动的功能,通常需要结合HTML5、CSS以及JavaScript,并利用设备的重力感应API。然而,直接通过HTML5和JavaScript访问设备的重力感应数据是有限的,因为这通常涉及到设备的底层硬件功能。在大多数情况下,这种功能是通过移动应用的原生…

【安全工具】Cobalt Strike使用教程:内网渗透之信息收集篇

一、前言二、内网信息收集篇2.1 判断是否存在域2.2 域内存活主机探测2.3 域内基础信息收集2.4 域内控制器的查找2.5 定位域管理员工具2.5.1 通过psloggedon.exe2.5.2 通过PVEFindADUser.exe2.5.3 通过PowerSploit的PowerView2.5.4 通过NetSess工具2.6 查找域管理进程2.6.1 本地…

pip安装包时报错 unable to get local issuer certificate

解决:pip install openpyxl -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

【安全运营】新一代安全运营

为什么企业投入了很高成本做安全建设后,安全事件还是层出不穷? 主要有以下四个原因: 1、资产管理、脆弱性修复等工作难开展 2、威胁看不清、防不住、难溯源 3、安全能力碎片化,难以在统一策略下完成协同响应 4、高阶人才稀缺,运营难有效持续为更好解决以上中问题的根因,安…