• 一、URL和URLConnection


    一、简述:

    在Java网络编程中,我们最常听到的一个单词是URL。URL标识了一个资源,并可以通过URL来获取这个资源。我们不知道资源具体是什么,也不需要关心怎么获取。你只需要拿到一个URL,你就可以定位到其对应的资源,并获取这个资源。所以,URL对于互联网来说是一个非常简单但是效用极高的设计。

    URL:URL全称叫做uniform resource locator,直译为“统一资源定位符”。简单地说,URL标识了互联网中的资源,并可以通过URL来获取资源。

    URI:而除了URL,URI也是经常见到的。URI全称叫做uniform resource identifier,直译为“统一资源标识符”。简单地说,URI就是标识了互联网中的某个资源。但是并不像URL那样还可以通过URI来获取资源。

    所以,URL是URI的一个子集,也可以说URL就是一种URI,可以用来标识资源。但是URL比URI增强了一种获取资源的特性。在互联网中我们也更常地去使用URL。

    二、什么是URL类:

    URL类,是在JDK中的java.net包下,它直接继承了object类。既然是一个类,那么就得知道怎么获得它的实例对象。

    JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/net/URL.html

    URL的构造方法有六种,这里使用其中字符串的形式:

    URL(String spec) // 根据String表示形式创建URL对象

    有了URL,我们就定位到了一个资源。

    注意:如果构造方法中指定的协议不是URL所支持的,那么会抛出MalformedURLException,所以你也可以通过这种方式来测试URL对各种协议的支持。

    但,JDBC和RMI这两种协议URL是不显示支持的,在JDBC包和RMI包自己内置支持。

    什么是URLConnection

    我们使用URL定位到了资源,同时我们也希望读取或者写入数据。URLConnection封装了这些细节

    JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/net/URLConnection.html

    URL类提供了一个方法:openConnection(),该方法返回一个URLConnection对象。URLConnection也是直接继承自object,它代表应用程序和URL之间的通信链接。可以用于读取和写入此URL引用的资源。

    URLConnection是一个抽象类,httpURLConnection则是URLConnection的直接子类。

    创建一个到URL的连接步骤

    1. 通过在URL上调用openConnection方法创建连接对象;
    2. 处理设置参数和一般请求属性;
    3. 使用connect方法建立远程对象的实际连接。
    4. 远程对象变未可用。远程对象的头字段和内容变为可访问。

    三、代码示例

    以下代码演示HttpUrlConnection

     JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/net/HttpURLConnection.html

    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    public class UrlConnectionDemo {
        private static final String string      = "http://domain/path";
        private static final String queryString = "name=lay&age=23";
    
        public static void main(String[] args) {
            URL               url           = null;
            HttpURLConnection urlConnection = null;
            Writer            writer;
            InputStream       inputStream;
            BufferedReader    reader;
            OutputStream      outputStream;
            try {
                // 构建URL
                url = new URL(string);
                // 构建连接对象,还未连接
                urlConnection = (HttpURLConnection) url.openConnection();
                // 设置请求方法,默认是GET
                urlConnection.setRequestMethod("POST");
                // 设置超时时间
                urlConnection.setConnectTimeout(60000);
                urlConnection.setReadTimeout(30000);
                // 是否缓存,默认为true
                urlConnection.setUseCaches(true);
                // 添加请求头
                urlConnection.addRequestProperty("key", "value");
                // 写入数据
                // 默认是false,需要显示设置
                urlConnection.setDoOutput(true);
                outputStream = urlConnection.getOutputStream();
                writer = new OutputStreamWriter(outputStream);
                writer.write(queryString);
                // 显示执行连接
                urlConnection.connect();
                // 允许输入,默认即是true,不需要显示设置
                urlConnection.setDoInput(true);
                // 获取输入流
                inputStream = urlConnection.getInputStream();
                // 链式包装读取器
                reader = new BufferedReader(new InputStreamReader(inputStream));
                // 读取数据
                StringBuilder stringBuilder = new StringBuilder();
                String        line;
                while ((line = reader.readLine()) != null) {
                    stringBuilder.append(line);
                }
                // 打印结果
                System.out.println(stringBuilder);
            } catch (MalformedURLException e) {
                System.out.println("URl不支持该协议, protocol=" + url.getProtocol());
            } catch (IOException e) {
                System.out.println("出现了IO异常");
                e.printStackTrace();
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }
        }
    
    }

    注意点:

    1. 经测试这里的connect()方法可以省略,因为getInputStream或者getOutputStream隐含着connect()连接操作;
    2. 该连接默认是GET请求,如果需要post请求可以使用setRequestMethod方法进行设置;
    3. 如果使用post方式,请求参数可以通过OutputSteam进行写操作,那就需要setDoOutput设置为true,默认是false;(setDoInput默认是true所以不用设置既可以读取响应的内容)
    4. 如果需要更为详细的信息可以参考JDK的URL类和URLConnection类的帮助文档。 
    5. Java的网络编程需要遵从释放模式,即在finally需要对打开的连接或者流进行关闭,当然你也可以使用try-with-resources的方式,而不用显示关闭。

      

  • 相关阅读:
    mysql数据库连接报错ERRoR1130(HY000)
    Ladap相关知识精简资料
    Github访问慢,解决方案
    IIS短文件漏洞成因,及修复方案
    Kali linux简单匿名处理方法
    NHibernate实践总结(二) 在mapping文件中设置抓取策略对HQL与Criteria造成不同影响的测试与验证
    NHibernate 3.x新功能实践(二) QueryOver(下)
    NHibernate实践总结(三)HQL的thetastyle join对无关联实体的连接与应用
    NHibernate实践总结(一)
    Scott Hanselman's 2009 NET与Windows终极开发工具列表
  • 原文地址:https://www.cnblogs.com/lay2017/p/7913360.html
Copyright © 2020-2023  润新知