Encode a URL in Android with a Utility Choreo
Temboo does a lot more than just work with APIs. We’ve got a growing collection of programming utilities that will make your life much easier. Here we’ll show you how to use these handy code shortcuts by working through a URL encoding example.
You might ask «why is URL encoding important?». Well, URLs can only be sent over the Internet using the ASCII character-set. Since URLs often contain non-ASCII characters, they need to be converted so they only contain valid characters. The general rule is that unsafe characters are replaced with a % followed by two hexadecimal digits. Spaces are replaced by either a plus sign (+) or with %20. You’ve probably seen URLs full of strange looking characters, and now you know why!
The good news is that you don’t actually have to worry about the specifics. Our URL encoding utility will do all the work for you.
Get Set Up
1 Log in to Temboo. If you don’t already have an account, you can register for free.
2 Download the Temboo Android SDK and add it to your development environment. Confirm that your project has in its manifest. Clear the text in the generated TextArea, and set its id to @+id/result . If you need help with any of these steps, please refer to our Android getting started tutorial, but copy and import the Utilities-1.76.jar instead of the Google-1.76.jar .
Test the Choreo
3 Go to the Utilities > Encoding > URLEncode Choreo in our library. Select Android from the drop down menu at the top of the page.
4 Enter some text that you want to URL encode. It should contain illegal characters, like spaces, accents, and punctuation. Here’s some text you can use:
5 Click Generate Code to test the Choreo from our website. You’ll see the the URL encoded result returned by the Choreo.
Create Your Android Program
6 To call the URL encoding Choreo from your Android program, copy the generated Code from your browser directly into the doInBackground method of your AsyncTask class and try running it. Your code should look something like this:
If you have questions about how to invoke DropboxTask in your MainActivity class, refer to our getting started tutorial, but find the correct TextView with TextView textView = (TextView) findViewById(R.id.result); .
7 Run the app and the URL encoded version of the text will be printed in the device screen.
What next?
We’re all finished! Now you know about Temboo’s range of handy developer utilities and how to access them via our Android SDK. Check out the rest of the 2000+ Choreos in our Library and see how you can combine them with our utilities to build something amazing.
Once you’ve got your code up and running, you’re ready to move on and do more. From monitoring your running applications, to moving your generated Temboo code to your preferred development environment and sharing it with colleagues, collaborators and friends — we’ve got you covered.
Источник
Кодировка URL в Android
как вы кодируете URL-адресом в Android?
Я думал, что это было так:
если я сделаю выше, то http:// на urlAsString заменить на http%3A%2F%2F на encodedURL и тогда я получаю java.net.MalformedURLException когда я использую URL.
6 ответов
вы не кодируете весь URL-адрес, только его части, которые поступают из»ненадежных источников».
кроме того, вы можете использовать строки.функция urlencode of DroidParts это не вызывает проверенных исключений.
или используйте что-то вроде
Я собираюсь добавить одно предложение здесь. Вы можете сделать это, чтобы избежать необходимости получения каких-либо внешних библиотек.
вы можете видеть, что в этом конкретном URL-адресе мне нужно закодировать эти пробелы, чтобы я мог использовать его для запроса.
Это использует несколько функций, доступных вам в классах Android. Во-первых, класс URL может разбить url-адрес на соответствующие компоненты, поэтому вам не нужно ничего делать поиск строки / замена работы. Во-вторых, этот подход использует функцию класса URI правильного экранирования компонентов при создании URI через компоненты, а не из одной строки.
красота этого подхода заключается в том, что вы можете взять любую допустимую строку URL и он будет работать без каких-либо специальных знаний об этом самостоятельно.
для android я бы использовал Строка android.сеть.Ури.encode (String s)
кодирует символы в данной строке как » % » — экранированные октеты, используя схему UTF-8. Оставляет буквы («A-Z», «a-z»), цифры («0-9») и неограниченные символы («_ -!.
‘()*») нетронутый. Кодирует все остальные символы.
Источник
URL encoding in Android
How do you encode a URL in Android?
I thought it was like this:
If I do the above, the http:// in urlAsString is replaced by http%3A%2F%2F in encodedURL and then I get a java.net.MalformedURLException when I use the URL.
Answers
You don’t encode the entire URL, only parts of it that come from «unreliable sources».
Alternatively, you can use Strings.urlEncode(String str) of DroidParts that doesn’t throw checked exceptions.
Or use something like
This behaves as expected. The URLEncoder implements the HTML Specifications for how to encode URLs in HTML forms.
From the javadocs:
This class contains static methods for converting a String to the application/x-www-form-urlencoded MIME format.
and from the HTML Specification:
application/x-www-form-urlencoded
Forms submitted with this content type must be encoded as follows:
- Control names and values are escaped. Space characters are replaced by `+’
You will have to replace it, e.g.:
For Python 2.x, use urllib.quote
Replace special characters in string using the %xx escape. Letters, digits, and the characters ‘_.-‘ are never quoted. By default, this function is intended for quoting the path section of the URL. The optional safe parameter specifies additional characters that should not be quoted — its default value is ‘/’.
Источник
Кодировка URL-адреса HTTP в Java
мое автономное приложение Java получает URL (который указывает на файл) от пользователя, и мне нужно нажать его и загрузить. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу правильно кодировать URL-адрес HTTP.
но, чего я хочу, так это
(пробел заменяется на %20)
Я думаю URLEncoder не предназначен для кодирования http-адресов. JavaDoc говорит » служебный класс для HTML кодировка формы». Есть ли другой способ сделать это?
24 ответов
java.сеть.Ури класс может помочь; в документации URL вы найдете
обратите внимание, что класс URI выполняет экранирование своих полей компонента в определенных обстоятельствах. Рекомендуемый способ управления кодированием и декодированием URL-адресов-использовать URI
использовать один из конструкторов с более чем одним аргументом, например:
(конструктор с одним аргументом URI не избегает незаконного персонажи)
только незаконные символы экранируются вышеуказанным кодом — он не экранирует символы, отличные от ASCII (см. комментарий Фатиха).
The toASCIIString метод может использоваться для получения строки только с символами US-ASCII:
для URL-адреса с запросом типа http://www.google.com/ig/api?weather=São Paulo , используйте 5-параметрическую версию конструктора:
пожалуйста, имейте в виду, что большинство ответов выше неверны.
на URLEncoder класс, несмотря на имя, это не то, что должно быть здесь. Жаль, что Сан назвала этот класс так раздражающе. URLEncoder предназначен для передачи данных в качестве параметров, а не для кодирования самого URL-адреса.
другими словами, «http://search.barnesandnoble.com/booksearch/first book.pdf» — это URL-адрес. Параметры будут, например, «http://search.barnesandnoble.com/booksearch/first book.pdf?parameter1=this¶m2=that» . Параметры-это то, что вы бы использовали URLEncoder for.
следующие два примера подчеркивает различия между ними.
следующее производит неправильные параметры, согласно стандарту HTTP. Обратите внимание на амперсанд (&) и плюс (+) неверно закодирован.
следующие будут производить правильные параметры, с запросом правильно закодированы. Обратите внимание на пробелы, амперсанды и знаки.
Я собираюсь добавить одно предложение, направленное на пользователей Android. Вы можете сделать это, чтобы избежать необходимости получения каких-либо внешних библиотек. Кроме того, все решения поиска/замены символов, предложенные в некоторых из ответов выше, опасны и их следует избегать.
вы можете видеть, что в этом конкретном URL-адресе мне нужно закодировать эти пробелы, чтобы я мог использовать его для запроса.
Это использует пару функции, доступные вам в классах Android. Во-первых, класс URL может разбить url на соответствующие компоненты, поэтому вам не нужно выполнять поиск/замену строк. Во-вторых, этот подход использует функцию класса URI правильного экранирования компонентов при создании URI через компоненты, а не из одной строки.
красота этого подхода заключается в том, что вы можете взять любую допустимую строку url и заставить ее работать без каких-либо специальных знаний об этом себе.
решение, которое я разработал и гораздо более стабильное, чем любое другое:
Если у вас есть URL, вы можете передать url.метод toString() в этот метод. Сначала декодируйте, чтобы избежать двойного кодирования (например, кодирование пробела приводит к %20, а кодирование знака процента-к %25, поэтому двойное кодирование превратит пробел в %2520). Затем используйте URI, как описано выше, добавив все части URL-адреса (чтобы не удалять параметры запроса).
Yeah URL encoding будет кодировать эту строку, чтобы она была правильно передана в url-адресе в конечный пункт назначения. Например, вы не могли бы http://stackoverflow.com?url=http://yyy.com. UrlEncoding параметр исправит это значение параметра.
У меня есть два варианта для вас:
есть ли у вас доступ к пути отдельно от домена? Если это так, вы можете просто UrlEncode путь. Однако, если это не тогда Вариант 2 может быть для вас.
получить commons-httpclient-3.1. Это имеет класс URIUtil:
система.наружу.println (URIUtil.encodePath («http://example.com/x y», «ISO-8859-1»));
Это выведет именно то, что вы ищете, так как он будет кодировать только часть пути URI.
FYI, вам понадобится commons-codec и commons-logging для работы этого метода во время выполнения.
Nitpicking: строка, содержащая символ пробела по определению не является URI. Итак, что вы ищете, это код, который реализует побег URI, определенный в раздел 2.1 RFC 3986.
к сожалению, org.apache.commons.httpclient.util.URIUtil устарел, и replacement org.apache.commons.codec.net.URLCodec подходит ли кодирование для сообщений формы, а не в фактических URL-адресах. Поэтому мне пришлось написать собственную функцию, которая делает один компонент (не подходит для целых строк запроса, которые есть ?Ы и &’с)
URLEncoding может кодировать HTTP-URL-адреса просто отлично, как вы, к сожалению, обнаружили. Строка, которую вы передали,»http://search.barnesandnoble.com/booksearch/first книга.pdf», был правильно и полностью закодирован в URL-кодированную форму. Вы можете передать всю длинную строку gobbledigook, которую вы получили в качестве параметра в URL-адресе, и ее можно декодировать точно в строку, которую вы передали.
похоже, вы хотите сделать что-то немного отличается от передачи всего URL-адреса в качестве параметра. Из того, что я понял, вы пытаетесь создать URL-адрес поиска, который выглядит как»http://search.barnesandnoble.com/booksearch/whateverTheUserPassesIn». Единственное, что вам нужно закодировать, это бит» whateverTheUserPassesIn», поэтому, возможно, все, что вам нужно сделать, это что-то вроде этого:
Это должно произвести что-то более действительное для вас.
по-прежнему существует проблема, если у вас есть закодированный «/» (%2F) в URL-адресе.
RFC 3986-раздел 2.2 гласит: «Если данные для компонента URI будут конфликтовать с назначением зарезервированного символа в качестве разделителя, то конфликтующие данные должны быть закодированы в процентах до формирования URI.»(RFC 3986-раздел 2.2)
но есть проблема с Tomcat:
важно: обход каталога CVE-2007-0450
Tomcat разрешает»\», «%2F » и «%5C» [. ] .
следующие системные свойства Java были добавлены в Tomcat для обеспечения дополнительный контроль за обработкой разделители путей в URL-адресах (оба варианта по умолчанию значение false):
- org.апаш.кот.утиль.баф.UDecoder.ALLOW_ENCODED_SLASH: true|false
- org.апаш.Каталина.соединитель.Койотадаптер.ALLOW_BACKSLASH: true|false
из-за невозможности гарантировать что все URL-адреса обрабатываются Tomcat как они находятся на прокси-серверах Tomcat всегда должен быть обеспечен, как если бы нет ограничение прокси контексте доступа используемый.
Итак, если у вас есть URL-адрес с символом %2F, Tomcat возвращает: «400 недопустимый URI: noSlash»
вы можете переключатель исправления в сценарии запуска Tomcat:
Я прочитал предыдущие ответы, чтобы написать свой собственный метод, потому что я не мог что-то работает должным образом, используя решения предыдущих ответов, это выглядит хорошо для меня но если вы можете найти URL, который не работает с этим, пожалуйста, дайте мне знать.
Если кто-то не хочет добавлять зависимость к своему проекту, эти функции могут быть полезны.
мы передаем часть «пути» нашего URL-адреса сюда. Вероятно, вы не хотите передавать полный URL-адрес в качестве параметра (строки запроса нуждаются в разных эскейпах и т. д.).
Я согласен с Мэттом. Действительно, я никогда не видел, чтобы это хорошо объяснялось в учебниках, но один вопрос заключается в том, как кодировать путь URL, и совсем другой-как кодировать параметры, которые добавляются к URL (часть запроса, за «?» символ.) Они используют похожую кодировку, но не одну и ту же.
специально для кодирования символа пробела. Путь URL-адреса должен быть закодирован как %20, тогда как часть запроса позволяет %20, а также знак»+». Лучшая идея протестируйте его самостоятельно на нашем веб-сервере, используя веб-браузер.
для обоих случаев я всегда будет кодировать КОМПОНЕНТ ЗА КОМПОНЕНТОМ, не всю строку. Действительно, URLEncoder позволяет это для части запроса. По пути часть вы можете использовать URI класса, хотя в этом случае он запрашивает всю строку, а не один компонент.
во всяком случае, я верю в это лучший способ избежать этих проблем-использовать личный неконфликтный дизайн. как? Например, я никогда не буду называть каталоги или параметры, используя другие символы, кроме a-Z, A-Z, 0-9 и _ . Таким образом, необходимо только кодировать значение каждого параметра, поскольку оно может исходить из пользовательского ввода, а используемые символы неизвестны.
Источник