对于我的Android应用程序中每个服务器请求,我需要编码参数,所以我的URL字符串看起来像
"http://example.com/script.php?param1="+URLEncoder.encode(param1.getText().toString(), "UTF-8")+"param2="+URLEncoder.encode(param2.getText().toString(), "UTF-8")+...."
它可以工作,但也许只能使用URLEncoder.encode一次 - 就像这样
URLEncoder.encode("http://example.com/script.php?param1="+param1.getText().toString()+"param2="+param2.getText().toString()+....", "UTF-8")
是否可以,或者有些情况可以崩溃?
答案 0 :(得分:1)
编码整个网址的网址不起作用,因为它会产生类似
的内容"http%3A%2F%2Fexample.com%2Fscript.php%3Fparam1%3Dasdf%26param2%3Djkl"
即。整个URL中的所有特殊字符都将被编码。你也不能对整个查询字符串进行url编码,因为=和&字符将被编码。
您必须对每个参数值进行编码,以阻止参数干扰URL解析中的特殊字符。辅助功能可以减轻疼痛。
String url = "http://example.com/script.php?" + encodeArgs("a", "a + b", "b", "=xxx=");
以及让你入门的东西
public String encodeArgs(String... args) {
final String encoding = "UTF-8";
try {
if (args.length % 2 != 0) {
throw new IllegalArgumentException("number of arguments not even");
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < args.length; i += 2) {
sb.append(URLEncoder.encode(args[i], encoding));
sb.append("=");
sb.append(URLEncoder.encode(args[i + 1], encoding));
sb.append("&");
}
// delete last &, if any
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
} catch (UnsupportedEncodingException e) {
throw new IllegalArgumentException("unsupported encoding " + encoding, e);
}
}
答案 1 :(得分:1)
您不应编码完整的网址。仅编码param部分,换句话说,只编码来自“不可靠来源”的部分。
所以你的第一次尝试"http://example.com/script.php?param1="+URLEncoder.encode(param1.getText().toString(), "UTF-8")+"param2="+URLEncoder.encode(param2.getText().toString(), "UTF-8")+...."
是正确的,你应该继续使用它。
URL encoding in Android和Android: howto parse URL String with spaces to URI object?有助于更清晰。