Это не поможет для прерывистых проблем, но может быть полезно для других людей с аналогичной проблемой.
Я клонировал виртуальную машину и запустил ее в другой сети с новым IP-адресом, но не изменил привязки в IIS. Fiddler показывал мне «Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом», и IE сказал мне «Включите TLS 1.0, TLS 1.1 и TLS 1.2 в дополнительных настройках». Изменение привязки к новому IP-адресу решило его для меня.
Вы не кодируете весь URL-адрес, а только его части, которые поступают из «ненадежных источников».
String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;
В качестве альтернативы вы можете использовать Strings.urlEncode (String str) из DroidParts , который не выбрал проверенные исключения.
Или используйте что-то вроде
String uri = Uri.parse("http://...")
.buildUpon()
.appendQueryParameter("key", "val")
.build().toString();
Я собираюсь добавить одно предложение здесь. Вы можете сделать это, чтобы избежать необходимости получать какие-либо внешние библиотеки.
Попробуйте:
String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
Вы можете видеть, что в этом конкретном URL-адресе мне нужно закодировать эти пробелы, чтобы я мог использовать его для запроса.
Это использует пару функций, доступных вам в классах Android. Во-первых, класс URL-адреса может разбить URL-адрес на его соответствующие компоненты, поэтому вам не нужно выполнять какие-либо операции поиска / замены строк. Во-вторых, в этом подходе используется функция класса URI для надлежащего экранирования компонентов при построении URI через компоненты, а не из одной строки.
Красота этого подхода заключается в том, что вы можете использовать любую действительную строку url и пусть он работает без каких-либо специальных знаний об этом.
вы можете использовать ниже методы
public static String parseUrl(String surl) throws Exception
{
URL u = new URL(surl);
return new URI(u.getProtocol(), u.getAuthority(), u.getPath(), u.getQuery(), u.getRef()).toString();
}
или
public String parseURL(String url, Map<String, String> params)
{
Builder builder = Uri.parse(url).buildUpon();
for (String key : params.keySet())
{
builder.appendQueryParameter(key, params.get(key));
}
return builder.build().toString();
}
, второй лучше первого.
Также вы можете использовать этот
private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);
, это самый простой метод
try {
query = URLEncoder.encode(query, "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Убедитесь, что используйте try ... catch. Если это не так.
Для android я бы использовал String android.net.Uri.encode (String s)
Кодирует символы в данной строке как «%» - экранированные октеты, используя схему UTF-8 , Листовые буквы («A-Z», «a-z»), номера («0-9») и незарезервированные символы («_- !. ~ '() *») нетронуты. Кодирует все остальные символы.
blockquote>Ex /
String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);
Uri.encode("a=1&b=1")
производит a%3D1%26b%3D1
, но ожидает a=1&b=1
– loentar
23 April 2015 в 12:06
a=1&b=1
в качестве запроса, вы хотите запросить именно это.
– Anubian Noob
21 August 2015 в 01:06
Uri.encode(query);
. – prasanthv 6 April 2014 в 17:13