Android Url&Uri详细解析

概述

在项目开发中,有时会遇到解析Url、Uri的需求,要从中得到链接中的相应字段、参数等。有多种实现方式,在这里总结一下应用到的。

URL与URI的区别

Uri - 统一资源标志符
Url - 统一资源定位符
都是定位资源位置

  • 所属包不同
    Url是 Java提供的一个类,位于java.net.URI
    Uri是Android 提供的一个类,位于android.net.Uri
    由此可见Uri是Url的扩展,来满足Android的需要
  • 作用不同

Uri是Android开发的,扩展了Java中URI的一些功能来特定的适用于Android开发,所以大家在开发时,只使用Android 提供的Uri即可;

Uri 结构

三种划分方式:

  • [scheme:]scheme-specific-part[#fragment]
  • [scheme:][//authority][path][?query][#fragment]
  • [scheme:][//host:port][path][?query][#fragment]

获取Uri元素

直接看代码、注释比较全,Uri各个部分都有对应的方法获取。为了方便直观的看到效果,可以对照着Log日志,总会找到你需要的。

private void button5() {
        String uri = "http://www.zpan.com:8080/lujing/path.htm?id=10&name=zhangsan&old=24#zuihoude";
        Uri mUri = Uri.parse(uri);

        // 协议
        String scheme = mUri.getScheme();
        // 域名+端口号+路径+参数
        String scheme_specific_part = mUri.getSchemeSpecificPart();
        // 域名+端口号
        String authority = mUri.getAuthority();
        // fragment
        String fragment = mUri.getFragment();
        // 域名
        String host = mUri.getHost();
        // 端口号
        int port = mUri.getPort();
        // 路径
        String path = mUri.getPath();
        // 参数
        String query = mUri.getQuery();

        Log.e("zpan", "======协议===scheme ==" + scheme);
        Log.e("zpan", "======域名+端口号+路径+参数==scheme_specific_part ===" + scheme_specific_part);
        Log.e("zpan", "======域名+端口号===authority ==" + authority);
        Log.e("zpan", "======fragment===fragment ==" + fragment);
        Log.e("zpan", "======域名===host ==" + host);
        Log.e("zpan", "======端口号===port ==" + port);
        Log.e("zpan", "======路径===path ==" + path);
        Log.e("zpan", "======参数===query ==" + query);

        // 依次提取出Path的各个部分的字符串,以字符串数组的形式输出
        List<String> pathSegments = mUri.getPathSegments();
        for (String str : pathSegments) {
            Log.e("zpan", "======路径拆分====path ==" + str);
        }
        // 获得所有参数 key
        Set<String> params = mUri.getQueryParameterNames();
        for(String param: params) {
            Log.e("zpan","=====params=====" + param);
        }

        // 根据参数的 key,取出相应的值
        String id = mUri.getQueryParameter("id");
        String name = mUri.getQueryParameter("name");
        String old = mUri.getQueryParameter("old");

        Log.e("zpan", "======参数===id ==" + id);
        Log.e("zpan", "======参数===name ==" + name);
        Log.e("zpan", "======参数===old ==" + old);
    }

Log

E/zpan: ======协议===scheme ==http
E/zpan: ======域名+端口号+路径+参数==scheme_specific_part ===//www.zpan.com:8080/lujing/path.htm?id=10&name=zhangsan&old=24
E/zpan: ======域名+端口号===authority ==www.zpan.com:8080
E/zpan: ======fragment===fragment ==zuihoude
E/zpan: ======域名===host ==www.zpan.com
E/zpan: ======端口号===port ==8080
E/zpan: ======路径===path ==/lujing/path.htm
E/zpan: ======参数===query ==id=10&name=zhangsan&old=24
/////////////////////////////路径//////////////////////////////
E/zpan: ======路径拆分====path ==lujing
E/zpan: ======路径拆分====path ==path.htm
/////////////////////////////参数//////////////////////////////
E/zpan: =====params=====id
E/zpan: =====params=====name
E/zpan: =====params=====old
E/zpan: ======参数===id ==10
E/zpan: ======参数===name ==zhangsan
E/zpan: ======参数===old ==24

补充方式

// 得到 uri 携带的参数  
private void getUriParams(){  
    String url = "http://www.zpan.com/get/uri/params?zhang=e5e5e5&wang=54522&zhao=02201&liu=1sui";  
    // 转换成 uri  
    Uri uri = Uri.parse(url);  
    Log.e("zpan","=uri= " + uri);  
    // 得到参数字符串  
    String zpParams = uri.getEncodedQuery();  
    Log.e("zpan","=zpParams= " + zpParams);  
    // 拆分获得单个参数  
    if (!TextUtils.isEmpty(zpParams)) {  
        String[] params = zpParams.split("&");  
        for (String param : params) {  
            String[] key_Value = param.split("=");  
            if (key_Value != null && key_Value.length == 2) {  
                Log.e("zpan","=key= " + key_Value[0] + " =value= " + key_Value[1]);  
            }  
        }  
    }  
} 

打印Log日志

com.example.zpdemo E/zpan: =uri= http://www.zpan.com/get/uri/params?zhang=e5e5e5&wang=54522&zhao=02201&liu=1sui  
com.example.zpdemo E/zpan: =zpParams= zhang=e5e5e5&wang=54522&zhao=02201&liu=1sui  
com.example.zpdemo E/zpan: =key= zhang =value= e5e5e5  
com.example.zpdemo E/zpan: =key= wang =value= 54522  
com.example.zpdemo E/zpan: =key= zhao =value= 02201  
com.example.zpdemo E/zpan: =key= liu =value= 1sui  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,308评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,035评论 25 709
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 8,332评论 0 7
  • 万众一致 规则: 1.游戏人员站成一排,主持人会提问,例如,摆出爱心动作 2.给予游戏人员一定思考时间,然后主持人...
    喻家隐士阅读 5,696评论 0 0
  • 画画真是个慢工细活。不过只有静下心来,才能享受这份美好。 应哈总要求,画了两幅她喜欢的画。 上图嘛,说实话,我觉得...
    sally0104阅读 2,435评论 0 2