2016-07-08 6 views
-1

Для каждого запроса на сервер в моем андроид приложение мне нужно кодировать параметры, так что моя строка для URL это выглядитДолжен ли я использовать URLEncoder для каждого URL Parametr

"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

невозможно кодировать полный полный URL ... Только его параметр encode –

ответ

1

URL, кодирующий весь URL не будет работать, так как это привело бы к чему-то вроде

"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

Вы не должны кодировать полный URL. Кодировать только раздел параметров или, другими словами, только его части, которые поступают из «ненадежных источников».

Итак, ваша первая попытка "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? могут быть полезны для большей ясности.