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)
在这样做之后,我根本没有从远程位置获得结果.我解决了这个问题并通过更换大括号来修复它
但我对我的解决方案并不完全满意.还有更好的解决方案吗?有什么东西整洁而不像我的硬编码?
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)
| 归档时间: |
|
| 查看次数: |
7410 次 |
| 最近记录: |