美文网首页Android开发Android
Android Url&Uri详细解析

Android Url&Uri详细解析

作者: IT一书生 | 来源:发表于2018-03-19 23:01 被阅读37次

    概述

    在项目开发中,有时会遇到解析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  
    

    相关文章

      网友评论

        本文标题:Android Url&Uri详细解析

        本文链接:https://www.haomeiwen.com/subject/aorofftx.html