URL -адреса повсюду, но кажется, что разработчики на самом деле не понимают их, потому что я часто вижу людей, которые спрашивают, как правильно создать URL при переполнении стека. Если вы хотите узнать, как работает синтаксис URL, вы можете прочитать эту статью Lunatech, что очень хорошо.
Эта статья не будет введена в глубину всего синтаксиса URL -адресов (если вы хотите полностью понять URL -адреса, вы можете прочитать RFC 3986, RFC 1738 и статья, упомянутая выше, а также документацию выше W3). Здесь я хочу поговорить о некоторых общих библиотеках в эксплуатационных URL-адресах и о том, как правильно их использовать через URL-Builder. Это библиотека Java, которую мы опубликовали для правильного создания URL -адресов.
Вопрос 1: Urlencoder Java
Мало того, что этот класс назван плохо, но его первое предложение в документе не очень правильное.
Утилита для кодирования формы HTML.
Вы можете задаться вопросом, почему это называется urlencoder, но вы совершенно безмолвно безмолвно, когда видите эту строку.
Если вы прочитали пост в блоге Lunatech, теперь вы должны понять, что вы не можете чудесным образом преобразовать строку URL в безопасный, правильно закодированный объект URL через этот класс. Конечно, если вы не сделали достаточно домашней работы, вот небольшой пример, который поможет вам понять.
Предположим, что у вас есть конечная точка HTTP Service http://foo.com/search, которая принимает параметр запроса p, а значение P - строка, которую нужно искать. Если вы ищете строку «You & I», URL -адрес поиска, который вы создали в первый раз, может быть таким: http://foo.com/search?q=you & I. Конечно, это не сработает, потому что и является сепаратором, который разделяет пара имени параметра запроса. Если вы получите эту грязную строку URL, вы беспомощны, потому что, прежде всего, вы не можете разобрать ее правильно.
ОК, давайте используем Urlencoder. Urlencoder.encode («You & I», «UTF-8»)-это результат, который вы+%26+i. После декодирования этого %26 он является &, а знак + представляет пробелы в строке запроса, поэтому этот URL может работать нормально.
Теперь предположим, что вы хотите использовать свою строку запроса, чтобы разбивать путь URL -адреса вместо того, чтобы помещать его в параметры URL. Очевидно, http://foo.com/search/you & я не правы. К сожалению, результат urlencoder.encode () также неверен. http://foo.com/search/you+%26+i получит/search/you+&+i, потому что знак+знак не будет разрешена на пространства на пути URL.
Urlencoder может удовлетворить некоторые из ваших сценариев. К сожалению, его чрезмерно общее название позволяет разработчикам легко использовать его. Следовательно, лучший способ - не использовать его, чтобы другие разработчики совершали ошибки при использовании других функций на вашей основе (если вы действительно не делаете «кодирование формы HTML»).
Вопрос 2: groovy httpbuilder и java's uri
HTTP Builder - это клиентская библиотека HTTP Groovy.
Создать обычный запрос на получение очень просто:
Новый httpbuilder ("http: // localhost: 18080") .request (method.get) {uri.path = "/foo"}Этот код отправит на сервер get /foo http /1.1 (вы можете запустить NC -L -P 18080, а затем выполнить этот код, чтобы проверить его).
Давайте попробуем URL, содержащий пространства.
Новый httpbuilder ("http: // localhost: 18080") .request (method.get) {uri.path = "/foo Bar"}Это отправляет GET /FOO%20BAR HTTP /1.1, что выглядит довольно хорошо.
Теперь предположим, что в нашем пути есть раздел под названием Foo/Bar. Это не может быть сделано, просто отправив Foo/Bar, потому что это будет рассматриваться как два сегмента на пути, Foo и Bar. Давайте попробуем foo%2fbar (замените / на соответствующее кодирование).
Новый httpbuilder ('http: // localhost: 18080') .request (method.get) {uri.path = '/foo%2fbar'}Это отправляет GET /FOO%252FBAR HTTP /1.1. Это не очень хорошо. %в %2F неоднократно кодируется, поэтому путь, полученный после декодирования, составляет foo %2fbar вместо Foo/Bar. Здесь действительно виновата, это java.net.uri, потому что класс Uribuilder в httpbuilder использует его.
Тип свойства URI, обнаруженного в закрытии конфигурации в вышеуказанном коде, является Uribuilder. Если вы обновите свойство Path URI через uri.path =…… в конечном итоге вызовет конструктор URI. Этот метод описывает свойство входящего пути следующим образом:
Если параметр пути предоставлен, он добавляется к URL. Персонажи в пути кодируются, если они не являются не заслуженными, акцентированными, сбежательными и другими категориями (Примечание переводчика: эти категории подробно описаны в RFC 2396) и не являются/или @ чисел.
Этот подход не очень значимый, потому что, если текст перед кодированием содержит специальные символы, он не может генерировать правильно кодированный сегмент пути. Другими словами, «я буду кодировать эту строку, и после кодирования она верна», что, конечно, является ошибкой, и Ури, оказалось, стала жертвой этой ошибки. Если строка была правильно закодирована, проблем нет. Если нет, это будет сделано, потому что строка не может быть проанализирована. Фактически, то, что говорится в документации, не избегает / означает, что она предполагает, что строка пути была правильно кодирована (то есть она правильно используется для разделения путей), и она не была правильно кодирована (другие части, кроме / все еще должны быть кодированы).
Было бы здорово, если бы httpbuilder не использовал эту дефектную функцию класса URI. Конечно, было бы еще лучше, если бы сам URI в порядке.
Правильный способ сделать это
Мы написали этот URL-строитель, который может помочь разработчикам легко развязать различные типы URL-адресов. Это следует за спецификациями кодирования в справочных материалах в начале статьи, а также предоставляет потоковой API. Следующий пример использования может охватывать почти все сценарии использования:
Urlbuilder.forhost ("http", "foo.com") .pathsegment ("с пространствами") .pathsegments ("path", "с", "varargs") .pathsegments ("& =?/") .Queryparam ("fancy + name", "fancy?" .fragment ("#? =") .tourlString ()Результатом является: http://foo.com/with%20spaces/path/with/varargs/&=%3f%2f;matrix=param%3f?fancy%20%2B%20Name=fancy?%3Dvalue#%23?=
Этот пример демонстрирует различные правила кодирования для каждой части URL. Например, некодируемый и = на пути разрешено, а?/ Необходимо кодировать, но = необходимо кодировать в параметрах запроса, но? Номер не нуждается в этом, потому что это уже является частью строки запроса (примечание переводчика: строка запроса начинается с цифра, поэтому она может включить номер A? После этого).
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!