网络——获取Web数

【0】README

0.1) 本文描述转自 core java volume 2, 旨在理解 “网络——获取Web数” 的基础知识;
0.2) for source code , please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter3/URL/URLConnectionTest.java
0.3) 应用背景: 为了在 java 程序中访问web server, 你可能希望在更高级别上进行, 而不只是创建套接字连接和发送 HTTP 请求;
0.4) 本文源代码用到了 Base64Encode 编码器,参见: http://blog.csdn.net/pacosonswjtu/article/details/50614466


【1】URL 和 URI(统一资源定位符(Uniform Resource Locator, URL) 和统一资源标识符(Uniform Resource Identifier, URI))

1)URL和 URLConnection类:封装了大量复杂的实现细节, 这些细节涉及如何从远程站点获取信息;

  • 1.1)如可以用一个 string 创建一个 URL 对象:

    URL url = new URL(urlString);

  • 1.2)如果只是想获得该资源的内容, 可以使用 URL 类中的openStream 方法:

    URL url = new URL(urlName);
    InputStream stream = url.openStream();
    Scanner in = new Scanner(stream);

2)java.net 包对 统一资源定位符(Uniform Resource Locator, URL) 和统一资源标识符(Uniform Resource Identifier, URI) 做了非常有用 的区分;

  • 2.1)URI和URL的区别: (干货——URI和URL的区别)

    • 2.1.1)URI: URI 是一个纯粹的语法结构, 包含用来指定web 资源的字符串的各种组成部分; (干货——URI定义)
    • 2.1.2)URL: URL 是URI的一个特例, 它包含了用于定位Web 资源的足够信息, 其他URI, 比如 mailto:tang@gmail.com 就不属于定位符, 因为根据该标识符我们无法定位任何数据。 像这样的URI 我们称之为 URN(Uniform Resource name, 统一资源名称);(干货——URL定义)(干货——URN-统一资源名称)
  • 2.2) 在java 类库中, URI 类不包含任何用于访问资源的方法, 它唯一作用就是解析; 相反, URL类可以打开一个到达资源的流: 所以 URL类只能作用于 那些 java 类库知道该如何如理的模式,如 http: , https, ftp:, 本地文件系统(file:), jar 文件(jar:);

3)URI详解:

  • 3.1)URI 规范给出了标记这些标识符的规则,一个 URI 具有以下句法:

    [scheme:]schemeSpecificPart【#fragment】

  • 3.2)上式中, […]表示可选部分,且 : 和 # 可以被包含在标识符内;

  • 3.3)绝对URI 和 相对 URI: 包含scheme: 部分 的 URI 称为绝对URI ,否则是相对URI; (干货——绝对和相对URI)
  • 3.4)不透明URI: 如果绝对URI 的 schemeSpecificPart 不是以 / 开头的,称为不透明的;如, mailto:tang@gmail.com (干货——不透明URI)
  • 3.5)分层URI: 所有绝对的透明URI 和所有相对的URI 都是分层的, 如: http://www.baidu.com/index.html (干货——分层URI)
  • 3.6)一个分层URI 的schemeSpecificPart 具有以下结构:

    [//authority][path][?query]

    • 3.6.1)对于那些基于服务器的URI, authority 部分具有以下形式:

      [user-info@]host[:port] , 而port必须是整数;

4)URI的作用: (干货——URI的作用)

  • 4.1)URI 类的作用之一: 解析标识符并将它分解成各种不同的组成部分, 你可以用如下方法读取他们:

    getScheme
    getSchemeSpecificPart
    getAuthority
    getUserInfo
    getHost
    getPort
    getPath
    getQuery
    getFrament

  • 4.1)URI的另一个作用: (干货——URI 的绝对化 和 相对化)

    • 4.1.1)组成绝对URI:处理绝对标识符和相 对标识符。 如果存在一个绝对URI: http://www.baidu.com/java/net/index.html; 和 一个相对URI: ../../java/net/index.html#socket(); 那么用它们组合成一个绝对URI: http://www.baidu.com/java/net/index.html#socket()
  • 4.2)与以上过程相反的是相对化URI: 假设一个URI: http://docs.mycompany.com/api 和另一个URI:http://docs.mycompany.com/api/java/lang/String.html; 那么相对化之后的URI 就是: java/lang/String.html;
  • 4.3) URI 类同时支持以上两个操作: (干货——URI的绝对化 和 相对化)

    relative = base.relativize(combined);
    combined = base.resolve(relative);


【2】使用URLConnection获取信息

1)引入 URLConnection的目的: 如果想从某个web 资源获取更多信息, 应该使用 URLConnection 类,通过它能够得到比 URL类更多的控制功能; (干货——推荐使用URLConnection ,它能够得到比 URL类更多的控制功能)
2)如何操作一个 URLConnection对象:

  • step1) 调用 URL 类中的openConnection方法:

    URLConnection connection = url.openConnection();

  • step2)使用以下方法来设置任意的请求属性:

    setDoInput
    setDoOutput
    setIfModifiedSince
    setUseCaches
    setAllowUserInteration
    setRequestProperty
    setConnectTimeout
    setReadTimeout

  • step3) 调用 connect方法连接远程资源:

    connection.connect();

  • step4)与服务器建立连接后, 可以查询头信息。

    • step4.1) getHeaderFieldKey 和 getHeaderField 两个方法枚举消息头的所有字段;
    • step4.2) getHeaderFields 方法返回一个包含了消息头中所有字段的标准Map对象;
    • step4.3) 为了方便起见, 以下方法可以查询各个标准字段:

      getContentType
      getContentLength
      getContentEncoding
      getDate
      getExpiration
      getLastModified

  • step5)最后,访问资源数据。

    • step5.1)使用 getInputStream 方法获取一个输入流用以读取信息;

Attention)一些coders 在使用 URLConnection 类的过程中形成了错误的观念, 它们认为 URLConnection 类中的 getInputStream 和 getOutputStream 方法与 Socket 类中的这些方法相似,这是错误的想法; (干货——一些coders 在使用 URLConnection 类的过程中形成了错误的观念)
3)URLConnection类中的一些方法:有几个方法可以在与server 建立连接之前设置连接属性,最重要的方法是 setDoInput 和 setDoOutput方法;

  • 3.1) 如果想要获得输出流:则 connection.setDoOutput(true);
  • 3.2)setIfModifiedSince 方法: 用于高速连接你只对自某个特定日期以来被修改过的数据感兴趣;
  • 3.3)setUseCaches 和 setAllowUserInteraction 方法:这两种方法只作用于Applet;
  • 3.4) setUseCaches 方法: 用于命令浏览器首先检查它的缓存;
  • 3.5)setAllowUserInteraction方法: 用于在访问有密码保护的资源时弹出对话框;
  • 3.6)总览全局的方法 setRequestProperty方法: 它可以用来设置对特定协议起作用的任何 “键值对”;

4)看个荔枝:如果你想访问一个由密码保护的web 页面, 按如下步骤操作:

  • step1) 将用户名,,冒号, 密码连接在一起:

    String input = username + “:” + password;

  • step2) 计算上一步骤得到的 Base64 编码;Base64 编码用于将字节序列编码成可打印的ASCII字节序列; (干货——Base64编码)

    String encoding = base64Encode(input);

  • step3)调用 setRequestProperty 方法,设置name参数的值为 Authorization , value设置为 Basic + encoding;

    connection.setRequestProperty(“Authorization”, “Basic” + encoding);

5)一旦调用了 connect方法, 就可以查询响应头信息;

  • step1)枚举所有相应头的字段:

    String key = connnection.getHeaderFieldKey(n); // 可以获得第n个键,n从 1开始;

  • step2)得到第n个值;

    String key = connnection.getHeaderField(n); // 可以获得第n个键,n从 1开始;

  • step3) getHeaderFields 方法: 返回一个 封装类响应头字段的Map 对象;

    Map<String, List< String>> headers = connection.getHeaderFields();

6) 为简单起见: java 提供了6个方法用以访问最常用的消息头类型的值, 并在需要的时候将其转换为 数值类型,见下表所示: (干货——java 提供了6个方法用以访问最常用的消息头类型的值)

这里写图片描述

7)看个荔枝(如何从web server 读取数据) 

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

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

相关文章

数据结构(三)之单链表反向查找

一、反向查找单链表 1、简单查找 先遍历获取单链表单长度n&#xff0c;然后通过计算得到倒数第k个元素的下标为n-k&#xff0c;然后查找下标为n-k的元素。 2、优化查找 先找到下标为k的元素为记录点p1&#xff0c;然后设置新的记录点p2的下标从0开始&#xff0c;同时遍历两个…

java使用:: 表达式_Java 13:切换表达式的增强功能

java使用:: 表达式您可能还记得我以前的文章&#xff0c;在Java 12中&#xff0c;传统的switch语句得到了增强&#xff0c;因此可以用作表达式。 在Java 13中&#xff0c;对该功能进行了进一步的更改 。 break语句不能再返回值。 相反&#xff0c;您必须使用新的yield语句&…

网络——Base64Encode(转:自定义Base64编码器——Base64Encode)

【0】README 0.1&#xff09; 本文source code 转自 core java volume 2 &#xff0c; 旨在了解 如何定义一个 编码器&#xff0c; 如Base64Encode &#xff1b; 0.2&#xff09;注意&#xff1a; 区别自定义的 Base64Encode 和 java.util.Base64 编码器 0.3&#xff09;fo…

数据结构(四)之单链表查找中间结点

一、查找单链表中间结点 1、简单查找 先遍历获取单链表单长度n&#xff0c;然后通过计算得到中间结点为n/2&#xff0c;然后查找下标为n/2的元素。 2、优化查找 先设置记录点fast、slow&#xff0c;下标均从0开始&#xff0c;fast走两步&#xff0c;slow走一步&#xff0c;同…

java面试常见面试问题_Java面试准备:15个Java面试问题

java面试常见面试问题并非所有的访谈都将重点放在算法和数据结构上—通常&#xff0c;访谈通常只侧重于您声称是专家的语言或技术。在此类访谈中&#xff0c;通常没有任何“陷阱”问题&#xff0c;而是它们要求您利用内存和使用该语言的经验–换句话说&#xff0c;它们测试您对…

网络——提交表单数据(post方式)

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 网络——提交表单数据 的基础知识 &#xff1b; 2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/cha…

html5实现最智能大气的公司年会抽奖(源码)

文章目录 1.设计来源1.1 主界面1.3 数据配置1.4 抽奖效果1.5 中奖效果 2.效果和源码配置2.1 动态效果2.2 员工信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码2.6 项目结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/…

Linux入门(一)之权限指令系统管理

一、权限指令 普通用户需要使用sudo或者root超级管理员可以执行权限指令。 二、linux系统init程序 &#xff08;1&#xff09;运行init程序&#xff08;引用runoob.com&#xff09; init 进程是系统所有进程的起点&#xff0c;你可以把它比拟成系统所有进程的老祖宗&#xf…

java jsf_使用Java和JSF构建一个简单的CRUD应用

java jsf使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 JavaServer Faces&#xff08;JSF&#xff09;是用于构建Web应用程序的Java框架&#xff0c;其中心是作为用户…

网络——发送email(一个简单荔枝)

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 网络——发送email 的基础知识 &#xff1b; 2&#xff09; for souce code , please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapte…

算法七之希尔排序

一、希尔排序 &#xff08;1&#xff09;简介 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL&#xff0e;Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量…

cuba 平台_CUBA平台:TypeScript SDK和REST API

cuba 平台在本文中&#xff0c;我们将讨论已存在很长时间但尚未广为人知的CUBA平台的功能- 前端SDK生成器 &#xff0c;并了解它如何与CUBA的REST API插件一起使用 。 Java JavaScript –网络婚姻 仅八年前&#xff0c;我们Java开发人员在我们的Web应用程序中使用JavaScript作…

算法八之归并排序

一、归并排序原理 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序…

数据库编程——intro to JDBC

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 数据库编程——JDBC 的基础知识 &#xff1b; 2&#xff09;JDBC起源&#xff1a; 96年&#xff0c; Sun公司发布了 第一版的java 数据库连接&#xff08;JDBC&#xff09;API&#…

java \t怎么从头开始_通过这些简单的步骤从头开始学习Java

java \t怎么从头开始Java是用于软件开发的最受欢迎的编程语言之一。 无论您的最终目标或技能水平如何&#xff0c;学习和掌握Java都将为您作为开发人员打开大门。 今天&#xff0c;我们将讨论一些原因&#xff0c;我们认为您应该开始学习Java&#xff0c;然后提供有关入门的深入…

HDFS 的dao

一、HDFS dao接口package cn.mk.dao;import java.io.FileNotFoundException; import java.io.IOException;import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus;public interface HDFSDao {public boolean mkDirs(String path) throws IOExcep…

数据库编程——JDBC 配置

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 数据库编程——JDBC 配置 的基础知识 &#xff1b; 2&#xff09; update timestamp: 1602022101&#xff1b; 更新内容有&#xff1a; 上传了一些图片&#xff0c; 而且举证说明了 为…

使用互联网了解的两个月里_我两个月来对Quarkus的了解

使用互联网了解的两个月里又一年&#xff0c;另一个来临&#xff0c;我很荣幸再次开启围绕Java&#xff0c;语言&#xff0c;生态系统和朋友的24篇精彩博客文章的统治&#xff0c;这些博客文章将我们所有人带入了今年最安静的假期。 这已经是第五年了&#xff08;我只错过了201…

javah导出类的头文件抛出异常——java.lang.IllegalArgumentException: Not a valid class name(原因及解决方法)

【0】README 0.1&#xff09; 本文旨在给出 java.lang.IllegalArgumentException 异常的原因 和 处理方法&#xff0c; 该异常和 javah 没有半毛钱关系 &#xff1b; 0.2&#xff09; 本文附带地给出了 javah 的作用 和 java 调用本地代码&#xff08;如 C语言&#xff09;的…

使用阿里巴巴json映射_使用JSON模式验证来映射稀疏JSON

使用阿里巴巴json映射在本文中&#xff0c;我们将探讨在创建和共享API时出现的问题。 特别是&#xff0c;需要&#xff1a; 表达数据的结构 提供对该数据的验证 允许将来改变主意 通过您拥有的部分数据与客户进行沟通 缺少数据时填写空白 人们通常使用版本编号的API解决此…