【问题标题】:Uri Builder in android - '/' replaced by '%2F' and ":" is replaced by "%3A"android 中的 Uri Builder - '/' 替换为 '%2F' 和 ":" 替换为 "%3A"
【发布时间】:2013-09-06 09:33:52
【问题描述】:

我想构建以下 URI -

https://10.112.88.182:8443/Vehicle/services/socialService/login

...

Builder builder = new Builder();
builder.scheme(Constants.URL_SCHEME);
builder.authority(host);
builder.appendPath(service + "/" +method);
return builder.build().toString();

在哪里

  • URL_SCHEME - https
  • host - 10.112.88.182:8443/Vehicle/services/
  • service - socialService
  • method - login

当此代码运行时,我得到以下 URI -

https://10.112.88.182%3A8443%2FVehicle%2Fservices%2F/socialService%2Flogin

/%2F 替换,:%3A 替换

【问题讨论】:

    标签: android url uri


    【解决方案1】:

    Uri.Builder 就是这样工作的。它将具有特殊含义的非安全 URL 字符编码为 %xx 十六进制值。

    为防止对已正确编码的 URI 部分进行编码,请使用 encoded 版本的构建器函数:

    builder.encodedAuthority(host);
    builder.appendEncodedPath(service + "/" +method);
    

    但由于您的所有 URL 部分都已准备好并且不需要任何进一步的编码,因此只需使用常规的 StringBuilder 来连接这些部分会更容易。

    【讨论】:

    • 那我如何才能在我的 IP 之后(端口 8443 之前)添加 ':' ?
    • 如果host 设置为10.112.88.182:8443,那么您可以构建您的路径,使其成为Vehicle/services/socialService/login,我相信这可以由.appendPath(Vehicle/services) 完成,加上额外的.appendPath().appendEncodedPath() 根据需要。
    • 如何添加带有逗号的内容作为查询参数? appendQueryParameter("zipcode", "12346,US") 编码了,
    【解决方案2】:

    就像 laalto 所说,这就是 Uri.Builder 的工作方式,但是如果您想以常规 url 形式获取 uri,例如您的情况:https://10.112.88.182:8443/Vehicle/services/socialService/login 你可以这样做:

    URL url = new URL(URLDecoder.decode(builder.build().toString(), "UTF-8"));
    

    【讨论】:

    • 这是一个很好的解决方案。因为原始请求试图返回一个字符串,所以最好的答案就是return URLDecoder.decode(builder.build().toString(), "UTF-8");
    【解决方案3】:

    解决方案很简单,只需使用appendEncodedPath(),它不会对您的字符串进行编码,它只是按原样附加它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 2015-01-14
      • 2015-04-08
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多