2013-04-25 3 views
1

Я делаю HTTP-клиент, где мне нужно отправить HTTP-запрос на получение данных. Я использую boost asio library, поэтому у меня нет возможности использовать стандартную библиотеку кодирования url.правильные использования кодировки url

Вот что я получил от Netcat и Mozilla (типичный запрос GET)

localhost:2000/questions/10838702/how-to-encode or-d ecode-url-in-objective-c 

Получить URL запроса

F:\pydev>nc -l -p 2000 
GET /questions/10838702/how-to-encode%20or-d%20%20%20ecode-url-in-objective-c HTTP/1.1 
Host: localhost:2000 
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

Я нашел Mozilla только кодирует часть запроса в URL.

Я попробовал этот URL-адрес веб-страницы кодирования http://meyerweb.com/eric/tools/dencoder/

И он кодирует следующий URL

localhost:2000/questions/10838702/how-to-encode or-d ecode-url-in-objective-c 

в

localhost%3A2000%2Fquestions%2F10838702%2Fhow-to-encode%20or-d%20%20%20ecode-url-in-objective-c 

Может кто-нибудь предложить мне, где использовать кодировку URL?

ответ

2

Как правило, любой символ, кроме букв и цифр (A-Z0-9), -_. и ~ либо имеют определенную цель в URL-адресе, либо не разрешены.

Зарезервированные символы: ;/?:@&= и пространство. Если вы используете какой-либо из этих символов иным способом, чем их особый смысл, вы должны его кодировать по URL-адресу. Чтобы быть в безопасности, многие кодировщики просто кодируют все, что явно не безопасно.

Например, предположим, что у вас есть имя файла с вопросительным знаком в нем (давайте назовем файл file?name, и вам необходимо создать URL-адрес. Проблема заключается в том, что http://somehost.com/file?name не будет интерпретироваться так, как вы хотите его быть. URL-адрес будет соответствовать /file в вашем веб-пространстве, и срок поиска в name. вы должны кодировать имя файла, чтобы получить URL http://somehost.com/file%3Fname.

спецификация позволяет URL-закодировать любой символ, даже буквенно-цифровые , с ожиданием того, что сервер будет некодирован. Вам просто нужно убедиться, что везде, где зарезервированные символы используются по назначению, они не закодированы, например: вы не хотите кодировать двоеточие или slas hes в http://somehost.com, потому что они используются как разделители.

Наиболее частое использование URL-кодирования заключается в подготовке данных формы. В этом случае вы обычно начинаете с набора пар ключ-значение. Вы бы построить кодированные данные для формы, как так (в псевдокоде):

  1. Encode ключ и значение
  2. Concatenate ключ и значение с «=» между ними, чтобы получить условия.например: encodedKey=encodedValue.
  3. Повторите 1 и 2, пока у вас есть список терминов
  4. Соедините все термины с амперсандами. например: encKey1=encVal1&encKey2=encVal2

Декодирование обратный процесс:

  1. Сплит данные формы вдоль знаков в «&», чтобы получить массив терминов
  2. Split каждый член символа «=» в получить кодированный ключ и значение
  3. Decode ключ и значение

Это звучит просто, но вы можете быть шокировал на сколько людей ошибается.

Я прояснил некоторые из более мелких деталей здесь. Как всегда, последняя спецификация является последним словом. В этом случае RFC 1738.

Смежные вопросы