我应该为每个URL参数使用URLEncoder吗?

时间:2016-07-08 07:00:05

标签: android utf-8 url-encoding

对于我的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")

是否可以,或者有些情况可以崩溃?

2 个答案:

答案 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 AndroidAndroid: howto parse URL String with spaces to URI object?有助于更清晰。

相关问题