美文网首页
URLEncoder编解🐎

URLEncoder编解🐎

作者: fyg | 来源:发表于2020-08-18 09:38 被阅读0次

如下方法报了一个 java.net.URISyntaxException异常 为什么会报这个异常呢?我是url 出问题了吗?


调用如下方法报的该异常:
  
public static boolean isValidUrl(String urlString) {
        URI uri = null;
        try {
            uri = new URI(urlString);
        } catch (URISyntaxException e) {
            //java.net.URISyntaxException解决办法
            return false;
        }

        if (uri == null || uri.getHost() == null) {
            return false;
        }
        String scheme = uri.getScheme();
        if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) {
            return true;
        }
        return false;
    }
    

java.net.URISyntaxException: Illegal character in query at index 209: https://mmember.jiuxian.com/club/clubPay?departmentId=101&departmentName=%e9%85%92%e5%9f%8e-%e6%b2%b3%e5%8d%97%e6%bf%ae%e9%98%b3%e5%b8%82%e5%8d%8e%e9%be%99%e5%8c%ba%e9%bb%84%e6%b2%b3%e4%b8%9c%e8%b7%af%e5%ba%97

Url为:
https://mmember.jiuxian.com/club/clubPay?departmentId=101&departmentName=%e9%85%92%e5%9f%8e-%e6%b2%b3%e5%8d%97%e6%bf%ae%e9%98%b3%e5%b8%82%e5%8d%8e%e9%be%99%e5%8c%ba%e9%bb%84%e6%b2%b3%e4%b8%9c%e8%b7%af%e5%ba%97

拿到url 经过URLEncode 转为原始Url为:

https://mmember.jiuxian.com/club/clubPay?departmentId=101&departmentName=酒城-河南濮阳市华龙区黄河东路店

感觉没问题呀,这是那里出错的?

从网上了解到:

报 java.net.URISyntaxException异常的原因是因为地址中涉及了特殊字符,如‘|’‘&’等。
java.net.URISyntaxException的解决办法

查看原始连接确实如此: 确实包含 & 特殊字符, 为什么会包含 & 呢,urlEncode后不应该呀,难道编码错了?

https://mmember.jiuxian.com/club/clubPay?departmentId=101&departmentName=%e9%85%92%e5%9f%8e-%e6%b2%b3%e5%8d%97%e6%bf%ae%e9%98%b3%e5%b8%82%e5%8d%8e%e9%be%99%e5%8c%ba%e9%bb%84%e6%b2%b3%e4%b8%9c%e8%b7%af%e5%ba%97

拿到url后我们 进行UrlDecode ,再进行一次UrlEncode 得到的内容如下:


https://mmember.jiuxian.com/club/clubPay?departmentId%3d101%26departmentName%3d%e9%85%92%e5%9f%8e-%e6%b2%b3%e5%8d%97%e6%bf%ae%e9%98%b3%e5%b8%82%e5%8d%8e%e9%be%99%e5%8c%ba%e9%bb%84%e6%b2%b3%e4%b8%9c%e8%b7%af%e5%ba%97

两次内容果然不同,生成二维码后,扫码跳转ok。

服务器人员应该是对url 了解不是太深入只对第二个参数进行了编码,造成的该问题

https://mmember.jiuxian.com/club/clubPay?departmentId=101&departmentName=酒城-河南濮阳市华龙区黄河东路店


  字符    urlEncode后的内容
  =     %3d          
  %     %25          
  &     %26          
  ?     %3f          
  空格    +            

uri连接中 参数是一个完整的uri 如何解析 ?


private String getLinkInfo() {
        try {
            Intent intent = getIntent();
            String action = intent.getAction();
            if (Intent.ACTION_VIEW.equals(action)) {

                Uri uri = intent.getData();
                if (uri != null) {
                    /**
                     * 使用uri.getQueryParameter("param") 解析url时, 会导致只能取到跳转链接和链接中的第一个参数,后面参数都取不到
                     * 例如:
                     * jiuxian://app/link?param=https://m.jiuxian.com/m_v1/dynamic/mob01/151289?deeplink=1&netEnv=wifi&flag=android&suptwebp=1&deeplink=1&from=singlemessage&isappinstalled=0
                     * 当使用uri.getQueryParameter("param")时 只能获取https://m.jiuxian.com/m_v1/dynamic/mob01/151289?deeplink=1 部分
                     * **/
                    String query = uri.getQuery();
                    int start = query.indexOf('=');
                    return query.substring(start + 1, query.length());
                }
            }
        } catch (Exception e) {

        }
        return "";
    }
    


 只需要将参数进行一次url decode 即可。
  
  
  Uri.Builder builder = new Uri.Builder();
        Uri uri = builder.scheme("jiuxian")
                .authority("app")
                .appendPath("link")
                .appendQueryParameter("param", Uri.encode("https://m.jiuxian.com/m_v1/dynamic/mob01/151289?deeplink=1&netEnv=wifi&flag=android&suptwebp=1&deeplink=1&from=singlemessage&isappinstalled=0")).build();
        String param = uri.getQueryParameter("param");
        System.out.println(Uri.decode(param));

相关文章

网友评论

      本文标题:URLEncoder编解🐎

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