URL和URI区别以及简单实战

一,区别
从URI和URL的定义就可以知道他们之间的区别

统一资源标识符(Uniform Resouce Identifier):一串连续的字符串可以识别所有抽象或真实的资源。

统一资源定位符(Uniform Resouce Locator):URI的子集,用于访问可用的资源。
二,URI实战
1.基本语法结构

[scheme:]scheme-specific-part[#fragment]
分为三部分:scheme、scheme-specific-part、fragment

进一步划分:
(1)path可以有多个,每个用/连接,比如:

scheme://authority/path1/path2/path3?query#fragment

(2)query参数可以带有对应的值,也可以不带,如果带对应的值用=表示,如:

这里有一个参数id,它的值是1
scheme://authority/path1/path2/path3?id = 1#fragment

(3)query参数可以有多个,每个用&连接

scheme://authority/path1/path2/path3?id = 1&name = mingming&old#fragment
这里有三个参数:
1.参数1:id,其值是:1
2.参数2:name,其值是:mingming
3.参数3:old,没有对它赋值,所以它的值是null

(4)在android中,除了scheme、authority是必须要有的,其它的几个path、query、fragment,它们每一个可以选择性的要或不要,但顺序不能变,比如:

1.其中"path"可不要:scheme://authority?query#fragment
2.其中"path""query"可都不要:scheme://authority#fragment
3.其中"query""fragment"可都不要:scheme://authority/path
4."path","query","fragment"都不要:scheme://authority
5.等等

终极划分
authority可以分为host:port的形式,即再次划分后是这样的:

[scheme:][//host[:port]][path][?query][#fragment]

其实还有如下这种形式,但不常见:

[scheme:][//[user-info@]host[:port]][path][?query][#fragment]

2.构造方法以及常用api
(1)构造方法

方法作用
public URI(String str) throws URISyntaxException通过给定的url字符串创建URI
public URI(String scheme,String userInfo, String host, int port,String path, String query, String fragment) throws URISyntaxException通过指定参数创建URI。
public URI(String scheme,String authority,String path, String query, String fragment) throws URISyntaxException通过指定参数创建URI。
public URI(String scheme, String host, String path,通过指定参数创建URI。
public URI(String scheme, String ssp, String fragment) throws URISyntaxException通过指定参数创建URI。
public static URI create(String str)静态创建URI。(推荐)

(2)常用api解析

方法作用
public String getScheme()返回URI的协议
public String getUserInfo()返回URI的用户信息
public String getAuthority()返回URI的授权(域名+端口号)
public String getHost()返回URI的主机。
public int getPort()返回URI端口部分。
public String getPath()返回URI路径部分。
public String getQuery()返回URI查询参数部分。
public String getFragment()获取此 URI 的锚点(也称为"片段")。
public URL toURL()转为java.net.URL

3.实战操作

package com.example.a;
 
import java.net.URI;
 
public class Demo {
    public static void main(String[] args) {
        String uriStr = "https://knife.blog.csdn.net/article/details/124509399?name=Tony&age=25#abc";
        URI uri = URI.create(uriStr);
        System.out.println("toString: " + uri.toString());
        System.out.println("toASCIIString: " + uri.toASCIIString());
        System.out.println("#####################################################");
        System.out.println("Scheme: " + uri.getScheme());
        System.out.println("SchemeSpecificPart: " + uri.getSchemeSpecificPart());
        System.out.println("Authority: " + uri.getAuthority());
        System.out.println("UserInfo: " + uri.getUserInfo());
        System.out.println("Host: " + uri.getHost());
        System.out.println("Port: " + uri.getPort());
        System.out.println("Path: " + uri.getPath());
        System.out.println("Query: " + uri.getQuery());
        System.out.println("Fragment: " + uri.getFragment());
        System.out.println("#####################################################");
        System.out.println("RawSchemeSpecificPart: " + uri.getRawSchemeSpecificPart());
        System.out.println("RawAuthority: " + uri.getRawAuthority());
        System.out.println("RawUserInfo: " + uri.getRawUserInfo());
        System.out.println("RawPath: " + uri.getRawPath());
        System.out.println("RawQuery: " + uri.getRawQuery());
        System.out.println("RawFragment: " + uri.getRawFragment());
    }
}

运行结果:

toString: https://knife.blog.csdn.net/article/details/124509399?name=Tony&age=25#abc
toASCIIString: https://knife.blog.csdn.net/article/details/124509399?name=Tony&age=25#abc
#####################################################
Scheme: https
SchemeSpecificPart: //knife.blog.csdn.net/article/details/124509399?name=Tony&age=25
Authority: knife.blog.csdn.net
UserInfo: null
Host: knife.blog.csdn.net
Port: -1
Path: /article/details/124509399
Query: name=Tony&age=25
Fragment: abc
#####################################################
RawSchemeSpecificPart: //knife.blog.csdn.net/article/details/124509399?name=Tony&age=25
RawAuthority: knife.blog.csdn.net
RawUserInfonull
RawPath: /article/details/124509399
RawQuery: name=Tony&age=25
RawFragment: abc

三,URL实战
1.理论认知
(1)网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。当你知道了这个概念,你就能明白,网络编程的重要性了吧,因为我们身边的各种APP,都是需要用到网络编程的。
(2)URL类是java.net包中的一个重要的类,使用URL创建对象的应用程序称为客户端程序。一个URL对象封装这一个具体的资源的引用,表明客户要访问这个URL中的资源,客户利用URL对象可以获取URL中的资源。一个URL对象通常包含最基本的三部分信息:
<1> 协议:协议必须是URL对象所在的Java虚拟机支持的协议,许多协议并不是我们常用的,虚拟机支持的常用协议有Http、Ftp、File。
<2> 地址:地址必须是能连接的有效IP地址或域名。
<3> 资源:资源可以是主机上的任何一个文件。
2.构造方法和常用api
(1)构造方法:URL通常使用public URL(String str) throws MalformedURLException 构造方法去创建一个对象。该构造方法使用字符串初始化一个URL对象:

try{
    URL url = new URL("http://www.baidu.com");
}catch(MalformedURLException e) {
    System.out.println("Bad URL:"+url);
}

上述url对象中使用的协议是http协议,即用户按着这种协议和指定的服务器通信,url对象包含的地址是www.baidu.com,所包含的资源是默认的资源(百度首页)。
除了上述构造方法之外,还有以下几种构造方法:

public URL(String protocol, String host, String file) throws MalformedURLException
使用指定的协议、主机名、文件名创建URL,端口使用协议的默认端口。
 
public URL(String protocol, String host, int port, String file) throws MalformedURLException.
通过给定的参数(协议、主机名、端口号、文件名)创建URLpublic URL(URL context, String url) throws MalformedURLException
使用基地址和相对URL创建

(2)常用api:URL类中包含了很多方法用于访问URL的各个部分,具体方法及描述如下:

public String getPath()
返回URL路径部分。
 
public String getQuery()
返回URL查询部分。
 
public String getAuthority()
获取此 URL 的授权部分。
 
public int getPort()
返回URL端口部分
 
public int getDefaultPort()
返回协议的默认端口号。
 
public String getProtocol()
返回URL的协议
 
public String getHost()
返回URL的主机
 
public String getFile()
返回URL文件名部分
 
public String getRef()
获取此 URL 的锚点(也称为"引用"public URLConnection openConnection() throws IOException
打开一个URL连接,并运行客户端访问资源。

3.实战
读取URL中的资源,URL对象调用InputStream openStream() 方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。
下面给出一个例子:

import java.net.*;
import java.io.*;
import java.util.*;
public class Main(){
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        URL url;
        Thread readURL;         //读取资源的线程
        Look look = new Look(); //线程的目标对象
        System.out.println("输入URL资源,例如:http://www.baidu.com");
        String source = scanner.nextLine();
        try{
            url = new URL(source);
            look.setURL(url);
            readURL = new Thread(look);
            readURL.start();          
        }catch(Exception e){
            System.out.println(e);
        }
    }
}
class Look implements Runnable {
    URL url;
    public void setURL(URL url){
        this.url = url;
    }
    public void run(){
        try{
            InputStream in = url.openStream();
            byte[] b = new byte[1024];
            int n = -1;
            while((n=in.read(b))!=-1) {
                 String str = new String(b,0,n);
                 System.out.println(str);   
            }
        }catch(IOException e) {}
    }
}

上述例子,用户在窗口输入网址,读取服务器资源,由于网络速度或其他的因素,URL资源的读取可能会引起阻塞,因此,程序需在一个线程中读取URL资源,以免阻塞主线程。
额外介绍一下InetAddress类:
(1)地址的表示,主机的两种方式表示地址:

域名 例:www.baidu.com
IP地址 例:202.108.34.253

java.net包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址。如:www.baidu.com/14.215.177.39

域名容易记忆,在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。
(2)获取地址:获取网上主机的地址,通过一个域名获取主机IP,可以使用该类中的一个静态方法getByName(String s)将一个域名或IP地址传给该方法参数s,获取一个InetAddress对象,该对象含有主机地址的域名和IP地址,该对象用如下格式表示:www.baidu.com/14.215.177.39
上代码!!!

import java.net.*;
 
public class InetAddress_test {
    public static void main (String[] args){
        try{
            InetAddress address = InetAddress.getByName("43.240.31.62");
            System.out.println(address.toString());
        }catch(UnknownHostException e){
            System.out.println("无法找到地址");
        }
        try{
            InetAddress address = InetAddress.getByName("www.baidu.com");
            System.out.println(address.toString());
        }catch (UnknownHostException e){
            System.out.println("无法找到地址");
        }
    }
}

运行以上程序需保证程序所在的计算机已经连到Internet上。
InetAddress类的其他方法:

static InetAddress getByAddress(byte[] addr)
在给定原始 IP 地址的情况下,返回 InetAddress 对象。
 
static InetAddress getByAddress(String host, byte[] addr)
根据提供的主机名和 IP 地址创建 InetAddressString getHostAddress() 
返回 IP 地址字符串(以文本表现形式)。
 
String getHostName() 
 获取此 IP 地址的主机名。
 
static InetAddress getLocalHost()
返回本地主机。
 
String toString()
将此 IP 地址转换为 String

OK,URI和URL的简单介绍就到这了,如有说的不对的地方欢迎评论指出,共同进步。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask是一个轻量级的Python Web框架,它提供了一些基本的工具和库,可以帮助你快速地构建Web应用程序。以下是一个简单的Flask Web开发实战示例: 1. 安装Flask框架 你可以使用pip命令来安装Flask框架: ``` pip install Flask ``` 2. 创建一个Flask应用程序 创建一个名为app.py的文件,并在其中编写以下代码: ```python from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello, World!" if __name__ == "__main__": app.run(debug=True) ``` 这个应用程序定义了一个路由,当用户访问根URL时,它将返回“Hello, World!”的响应。 3. 运行应用程序 在终端中运行以下命令: ``` python app.py ``` 这将启动应用程序,并在浏览器中打开http://localhost:5000,你应该看到“Hello, World!”的文本。 4. 添加更多的路由 你可以添加更多的路由来处理不同的URL请求。例如,你可以创建一个名为/about的路由: ```python @app.route("/about") def about(): return "This is the about page." ``` 现在,当用户访问/about时,它将返回“This is the about page.”的响应。 5. 使用模板引擎 Flask还提供了一些模板引擎,可以帮助你在Web应用程序中呈现动态内容。以下是一个使用Jinja2模板引擎的示例: ```python from flask import Flask, render_template app = Flask(__name__) @app.route("/") def index(): return render_template("index.html", name="John") if __name__ == "__main__": app.run(debug=True) ``` 在这个应用程序中,我们使用render_template函数来呈现名为index.html的模板。模板中的变量name将被替换为“John”。 6. 集成数据库 Flask还提供了一些扩展,可以帮助你集成数据库到应用程序中。例如,你可以使用Flask-SQLAlchemy扩展来处理数据库操作。以下是一个使用SQLite数据库的示例: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.db" db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True, nullable=False) def __repr__(self): return "<User %r>" % self.name @app.route("/") def index(): user = User(name="John") db.session.add(user) db.session.commit() return "User added to database." if __name__ == "__main__": app.run(debug=True) ``` 在这个应用程序中,我们定义了一个名为User的模型,并使用db.session添加了一个新的用户到数据库中。 这只是一个简单的Flask Web开发实战示例,Flask提供了很多功能和扩展,可以帮助你构建更复杂的Web应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值