文章目录

  • 1. 简介
  • 2. 打开URLConnection
  • 3. 读取服务器的数据
  • 4. 读取首部
  • 5. 获取任意首部字段

1. 简介

URLConnection是一个抽象类,表示指向URL指定资源的活动连接。URLConnection有两个不同但相关的用途。首先,与URL类相比,它对服务器(特别是HTTP服务器)的交互提供了更多控制。URLConnection可以检查服务器发送的首部,并相应地做出响应。它可以设置客户端请求中使用的首部字段,最后URLConnection可以用POST、PUT和其他HTTP请求方法向服务器发回数据。其次URLConnection类是JAVA的协议处理器机制的一部分,这个机制还包括URLStreamHandler类。协议处理器的思想很简单:它们将处理协议的细节与处理特定数据类型分开,提供相应的用户接口,并完成完整的Web浏览器所完成的其他操作。基类java.net.URLConnection是抽象类,要实现一个特定的协议,就要编写一个有奇怪模式的URL,它不会“绝望”地发出一个错误信息,而是会为这个未知协议下载一个协议处理器,用它与服务器通信。java.net包中只有抽象的URLConnection类。具体的子类都隐藏在sun.net包中。URLConnection的许多方法以及一个构造函数都是保护的,意味着它们只能有URLConnection类或其子类实例访问。

2. 打开URLConnection

直接打开URLConnetion类的程序遵循一下基本步骤:

  • 构造一个URL对象
  • 调用这个URL对象的openConnetion()获取对应URL的URLConnetion对象
  • 配置这个URLConnection
  • 读取首部字段
  • 获得输入流并读取数据
  • 获得输出流写入数据
  • 关闭连接

URLConnection类声明为抽象类,不过除了Connect方法,其他方法基本上它本身都已经实现了,所以其子类必须实现connect方法,该方法建立与服务器的连接,因而依赖与服务类型。第一次构造URLConnection时,它是未连接的,也就是说,本地和远程主机无法发送和接受数据。没有Socket连接这两个主机,connect()方法在本地和远程主机之间建立一个连接(一般使用TCP Socket),这样就可以收发数据了。不过我们一般不用显示的调用connect()方法,因为对于getInputStream()、getContent()、getHeaderField()方法和其他要求打开连接的方法,如果连接没有打开,这些方法内部会调用connect()方法

3. 读取服务器的数据

下面是使用URLConnection对象,从一个URL获取数据所需的最起码的步骤:

  • 构造一个URL对象
  • 调用这个URL对象的openConnection()方法,获取对应URL得URLConnection对象
  • 调用这个URLConnection的getInputStream()方法
  • 使用通常的流API读取输入流

下面使用URLConnection下载百度主页

public class QuizCardBuilder {public static void main(String[] args) {try{//定义URL对象URL u=new URL("http://www.baidu.com");//获取URLConnection对象URLConnection urlConnection=u.openConnection();//在try()中写入我们需要自动关闭的资源,后期会帮我们自动关闭try (InputStream raw=urlConnection.getInputStream()){//以流链的形式封装原始流,加入缓存提高IO效率InputStream buffer=new BufferedInputStream(raw);Reader reader=new InputStreamReader(buffer);int c;while((c=reader.read())!=-1){System.out.print((char)c);}}} catch (MalformedURLException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

对于这个例子这样一个简单的输入流,URL和URLConnection之间的区别并不明显

  • URLConnection提供了对HTTP首部的访问
  • URLConnection可以配置发送给服务器的请求参数
  • URLConnection除了读取服务器数据外,还可以向服务器写入数据

4. 读取首部

如下图我们在谷歌浏览器中看到我们请求的头信息,其主要包括六个部分:

  • Content-type:实际返回的内容的内容类型
  • Content-length:实际返回的内容的内容长度
  • Content-encoding:实际返回的内容的内容编码
  • Date:实际返回的内容
  • Last-modified:上一次在服务端的修改时间
  • Expires:头信息过期时间

下面介绍URLConnection的对应获取方法

  • public String getContentType()

该方法返回响应体的MIME内容类型,它一路web服务器发来的一个有效的内容类型。

public class QuizCardBuilder {public static void main(String[] args) {try{//定义URL对象URL u=new URL("http://www.baidu.com");//获取URLConnection对象URLConnection urlConnection=u.openConnection();//在try()中写入我们需要自动关闭的资源,后期会帮我们自动关闭System.out.println(urlConnection.getContentType());} catch (MalformedURLException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

  • public int getContentLength()

告诉你内容有多少字节,如果没有Content-length首部就会返回-1.如果发现资源的长度超过Integer.MAXVALUE也会返回-1,下面代码实现了下载二进制文件。

public class QuizCardBuilder {public static void main(String[] args) {try {//定义URL对象URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");URLConnection urlConnection = u.openConnection();File mygram = new File("my.jpg");saveBinaryFile(u);} catch (MalformedURLException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}public static void saveBinaryFile(URL u) throws IOException{//获得URLConnection对象URLConnection urlConnection=u.openConnection();//获得Content-typeString contentype=urlConnection.getContentType();System.out.println("Contentype:"+contentype);//获得Content-lengthint contetnLength=urlConnection.getContentLength();System.out.println("ContentLength:"+contetnLength);if(contentype.startsWith("text/")||contetnLength==-1){throw new IOException("this is not a binary file");}//获得内容的IO流try(InputStream raw=urlConnection.getInputStream()){InputStream in =new BufferedInputStream(raw);byte[] data=new byte[contetnLength];int offset=0;while(offset < contetnLength){int bytesRead=in.read(data,offset,data.length-offset);if(bytesRead==-1) break;offset+=bytesRead;}try(FileOutputStream fout=new FileOutputStream("myimg.jpg")){fout.write(data);fout.flush();}}}
}

百度图片的信息

成功下载到本地

  • public String getContentEncoding()

该方法返回一个String,指出内容是如何编码的,如果发送的内容没有编码,这个方法就会返回null,而不抛出异常。

  • public long getDate

该方法返回一个long,指出文档何时发送,这个时间按格林乔治标准时间(GMT)

  • public long getExpiration()

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

  • public long getLastModified()

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

5. 获取任意首部字段

上面的6个方法请求首部中的指定字段,不过对于一个消息中包含多少首部字段理论上没有限制,下面5个方法可以检索首部中的任意字段。

  • public String getHeaderField(String name)

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

public class QuizCardBuilder {public static void main(String[] args) {try {//定义URL对象URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");URLConnection urlConnection = u.openConnection();System.out.println("ContenType:"+urlConnection.getHeaderField("Content-Type"));System.out.println("Date:"+urlConnection.getHeaderField("Date"));System.out.println("Last-Modified+"+urlConnection.getHeaderField("Last-Modified"));} catch (MalformedURLException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

  • public String getHeaderFieldKey(int n)

这个方法返回第n个首部字段的键。请求方法本身就是第0个首部,它的键是null

public class QuizCardBuilder {public static void main(String[] args) {try {//定义URL对象URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");URLConnection urlConnection = u.openConnection();System.out.println("1:"+urlConnection.getHeaderFieldKey(1));System.out.println("2:"+urlConnection.getHeaderFieldKey(2));System.out.println("3:"+urlConnection.getHeaderFieldKey(3));System.out.println("4:"+urlConnection.getHeaderFieldKey(4));System.out.println("5:"+urlConnection.getHeaderFieldKey(5));} catch (MalformedURLException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

  • public String getHeaderField(int n)

这个方法是返回第n个首部的值。在HTTP中,包含请求方法和路径的起始行是第0个首部。下面代码来显示所有首部:

public class QuizCardBuilder {public static void main(String[] args) {try {//定义URL对象URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");URLConnection urlConnection = u.openConnection();for (int i = 1; ; i++) {String header=urlConnection.getHeaderField(i);if(header==null)break;System.out.println(urlConnection.getHeaderFieldKey(i)+": "+header);}} catch (MalformedURLException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

  • public long getHeaderFieldDate(String name,long default)

这个方法首先获取由name参数指定的首部字段,然后尝试将这个字符转换为一个long(GMT 1970年1月1日子夜之后经过的毫秒数)。它可以用来获取表示日期的首部字段。为了将字符串转换为整数,该方法使用了java.util.Date中的parseDate方法

public class QuizCardBuilder {public static void main(String[] args) {try {//定义URL对象URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");URLConnection urlConnection = u.openConnection();System.out.println(urlConnection.getHeaderFieldDate("Expires",0));} catch (MalformedURLException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

  • public int getHeaderField(String name,int default)

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

public class QuizCardBuilder {public static void main(String[] args) {try {//定义URL对象URL u = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fbbe9c79f-2f81-4387-bc64-c88b5daf78fa%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687610199&t=d3fd58ff3a0f868d2511c8fc1adaecbd");URLConnection urlConnection = u.openConnection();System.out.println(urlConnection.getHeaderFieldInt("content-length",-1));} catch (MalformedURLException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

URLConnection(一)相关推荐

  1. [javaSE] 网络编程(URLConnection)

    获取URL对象,new出来,构造参数:String的路径 调用URL对象的openConnection()方法,获取URLConnection对象 调用URLConnection对象的getInput ...

  2. Java 使用 URLConnection 模拟 Http Get和Post 提交

    2019独角兽企业重金招聘Python工程师标准>>> Java 使用 URLConnection 模拟 Http Get和Post 提交. 1.URLConnectionHelpe ...

  3. 简单使用URLConnection、HttpURLConnection和HttpClient访问网络资源

    URL的openConnection方法将返回一个URLConnection,该对象表示应用程序和URL之间的通信连接.程序可以通过它的实例向该URL发送请求,读取URL引用的资源. 下面通过一个简单 ...

  4. Android URLconnection

    为什么80%的码农都做不了架构师?>>>    #使用Thread请求HTTP # 普通的使用java的Thread 线程,在重写run 方法,实现HTTPConnection pu ...

  5. URI和URLConnection类的区别

    URI和URLConnection类的区别 (1) URI格式 通用资源标志符(Universal Resource Identifier, 简称"URI") 就Android平台 ...

  6. 通过java.net.URLConnection发送HTTP请求的方法

    2019独角兽企业重金招聘Python工程师标准>>> 1.GET与POST请求的区别 a) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet, b) ...

  7. java消费者中url找不到,java – URL可以使用浏览器访问,但是仍然是具有URLConnection的FileNotFoundException...

    我使用HttpURLConnection连接到一个网站,并收到一个ResponseCode = 404(HTTP_NOT_FOUND).但是,我的浏览器(IE)中打开网站没有问题. 为什么有区别,我能 ...

  8. 使用URLConnection获取网页信息的基本流程

    参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...

  9. java url 授权_Java:如何使用UrlConnection发布请求与授权?

    我想生成POST请求到一个需要验证的服务器.我试图使用以下方法: private synchronized String CreateNewProductPOST (String urlString, ...

  10. URLConnection

    转载(http://www.cnblogs.com/shyang--TechBlogs/archive/2011/03/21/1990525.html) 关于URLConnection,网上很多回答都 ...

最新文章

  1. 计算机的应用范围归纳起来主要有,计算机应用基础知识概述.doc
  2. Java jvisualvm简要说明
  3. linux的rhce考试题,【干货】RHCE考题和详细答案详攻略(一)
  4. 没用过这些 IDEA 插件?怪不得写代码头疼
  5. 剑指offer:合并两个排序的链表
  6. scrapy框架的概念和流程
  7. 基于 OpenCV 的图像阴影去除,你会吗?
  8. HTTP/1 已死!
  9. vim入门教程(简洁有效)
  10. 收集了一些python的文章
  11. Leetcode(337)-打家劫舍III
  12. java udp 接收16进制_java UDP通信中十六进制的接收与发送
  13. 复变函数在计算机科学中的应用,复变函数的应用以及发展史
  14. python批量合并txt文件内容,Python 批量合并多个txt文件的实例讲解
  15. 基于github上camera开源框架CameraKit,实现仿微信拍照摄像功能
  16. 全方位剖析“清华同方”,脉络千里!!
  17. wechat微信小程序 :对应的服务器证书无效
  18. 维修技术论坛万能预装系统 v5.0
  19. 大豆技术面分析_大豆优质高产技术分析,种植大豆产量低,只因这几点你没做到...
  20. 记:一次意外JTAG使用引发对于STM32内核的了解

热门文章

  1. 开源应用架构之​Selenium WebDriver
  2. VS Code 基础教程(一)—— VS Code 的基本使用入门
  3. JavaScript中运算符优先级
  4. 国外顶尖高校、企业分享人工智能自学课程英文原课程分享
  5. php yar 扩展,php的基于yaf+yar+yac环境搭建
  6. DW01A单节可充电锂电池的过充电和过放电保护电路IC
  7. Referrer和Referrer Policy介绍
  8. 《机器学习实战》——线性回归提高篇之乐高玩具套件二手价预测
  9. 【性能优化方法论系列】三、性能优化的核心思想(3)
  10. 欢you度yuan元旦赛(18.1.1)