包含花括号的URL的HttpClient问题

PH7*_*PH7 6 android httpclient

我在我的Android应用程序中使用HttpClient.在某些时候,我必须从远程位置获取数据.下面是我如何利用HttpClient获取响应的片段.

String url_s = "https://mydomain.com/abc/{5D/{B0blhahblah-blah}I1.jpg"; //my url string
DefaultHttpClient httpClient = new DefaultHttpClient();
response = httpClient.execute(new HttpGet(url_s));
Run Code Online (Sandbox Code Playgroud)

它在大多数情况下都可以正常工作,但是当我的url中有一些花括号基本上是String时就不行了.堆栈跟踪显示花括号的索引,表示无效字符.所以我尝试从编码的URL创建URI.

URL url = new URL(url_s);
URI uri = url.toURI();
response = httpClient.execute(new HttpGet(uri));
Run Code Online (Sandbox Code Playgroud)

在这样做之后,我根本没有从远程位置获得结果.我解决了这个问题并通过更换大括号来修复它

  • "{"with"%7B"
  • 带有"%7D"的"}"

但我对我的解决方案并不完全满意.还有更好的解决方案吗?有什么东西整洁而不像我的硬编码?

Mer*_*lin 10

严格的答案是你的URL中永远不应该有大括号

有关URL的完整描述可以在RFC1738中找到

该答案的相关部分如下

不安全:

出于多种原因,角色可能不安全.空间
字符是不安全的,因为
当URL被转录或
排版或受到文字处理程序的处理时,重要的空格可能会消失并且可能引入无关紧要的空间.
字符"<"和">"是不安全的,因为它们被用作
自由文本中URL 的分隔符; 引号(""")用于
分隔某些系统中的URL.字符"#"是不安全的,应始终进行编码,因为它在万维网和其他
系统中用于从片段/锚点分隔URL字符"%"是不安全的,因为它用于
其他字符的编码.其他字符是不安全的,因为
已知网关和其他传输代理有时会修改
这些字符.这些字符是"{","} ","|","\","^","〜",
"[","]"和"`".

所有不安全的字符必须始终在URL中编码.对于
例如,"#"字符必须在网址中,即使在编码
不正常处理片段或锚系统
标识符,因此,如果URL复制到另一个系统,该系统
不使用它们,就没有必要改变URL编码.

为了绕过您遇到的问题,您必须对您的网址进行编码.

当整个URL被编码时,包括https://mydomain.com/部分,这会导致"主机可能不为空"错误.您只想编码URL的最后一部分,称为路径.

解决方案是使用Uri.Builder类从应该对进程中的路径进行编码的各个部分构建URI

您可以在Android SDK Uri.Builder参考文档中找到详细说明

使用您的值的一些简单示例是:

Uri.Builder b = Uri.parse("https://mydomain.com").buildUpon();
b.path("/abc/{5D/{B0blhahblah-blah}I1.jpg");
Uri u = b.build();
Run Code Online (Sandbox Code Playgroud)

或者你可以使用链接:

    Uri u = Uri.parse("https://mydomain.com").buildUpon().path("/abc/{5D/{B0blhahblah-blah}I1.jpg").build();
Run Code Online (Sandbox Code Playgroud)