【问题标题】:Get parameter after "#" from url java从url java获取“#”之后的参数
【发布时间】:2014-09-24 06:51:19
【问题描述】:

我有一个 https://stackexchange.com/oauth/login_success#access_token=token&expires=5678 形式的重定向 uri。我正在尝试从此 url 获取访问令牌。尝试了以下方法

uri.getQueryParameter("access_token"); //will return null since it is not a query param

uri.getFragment(); //will return "access_token=token&expires=5678" so i need to seperate it again.

有什么直接的方法吗?请帮忙

【问题讨论】:

  • 你可以得到 indexOf # 然后从邮件的uri字符串中创建一个子字符串
  • 请问还有其他方法吗?
  • getFragment() 最好的方法。 # 之后的所有内容都被认为(通过 URL/URI)是一个很大的值。如果它被分隔或具有特殊编码,则由应用程序(在本例中为您)来处理。
  • @WilliamPrice 是的。但我再次必须拆分字符串以获取令牌。还有其他方法吗?请
  • @deniz 没有其他“魔术”方法可以自动知道该做什么,没有。您将不得不编写代码。

标签: java android uri


【解决方案1】:

有些人可能会觉得这很有帮助

   String queryAfterFragment = uri.getFragment();
   String dummy_url = "http://localhost?" + queryAfterFragment;
   Uri dummy_uri = Uri.parse(dummy_url);
   String access_token = dummy_uri.getQueryParameter("access_token");

像魅力一样工作,易于使用,稍后感谢我 :-)

【讨论】:

    【解决方案2】:

    简单而优雅的解决方案,可以获得您想要的值:

    public static Map<String, String> parseUrlFragment (String url) {
    
        Map<String, String> output = new LinkedHashMap<> ();
    
        String[] keys = url.split ("&");
    
        for (String key : keys) {
    
            String[] values = key.split ("=");
            output.put (values[0], (values.length > 1 ? values[1] : ""));
    
        }
    
        return output;
    
    }
    

    它使用LinkedHashMap来表示值,所以它是输出:

    Map<String, String> data = parseUrlFragment (uri.getFragment ());
    
    data.get ("access_token") // token
    data.get ("expires") // 5678
    

    【讨论】:

      【解决方案3】:

      你可以这样试试

      String str = "https://stackexchange.com/oauth/
                                   login_success#access_token=token&expires=5678";
      int indexOfHash = str.indexOf("#");
      // now you can substring from this
      String subStr = str.substring(indexOfHash+1, str.length());
      System.out.println(subStr);
      // now you can substring from &
      String sStr=subStr.substring(0,subStr.indexOf("&"));
      System.out.println(sStr);
      // now you can get token
      String[] arr=sStr.split("=");
      System.out.println(arr[0]);
      System.out.println(arr[1]);
      

      输出

      access_token=token&expires=5678
      access_token=token
      access_token
      token
      

      【讨论】:

        【解决方案4】:

        您可以将 String 方法 split(String) 与 Regex 一起使用

        str.split("#|&|=") 
        

        这将通过传递的 3 个字符拆分字符串,您将获得一个包含所有拆分部分的数组。

        String s = 
            "https://stackexchange.com/oauth/login_success#access_token=token&expires=5678";
        final String[] split = s.split("#|&|=");
        for (String s1 : split) {
          System.out.println(s1);
        }
        

        输出:

        https://stackexchange.com/oauth/login_success
        access_token
        token
        expires
        5678
        

        【讨论】:

          猜你喜欢
          • 2013-11-01
          • 1970-01-01
          • 2011-06-01
          • 2014-05-12
          • 2016-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多