2015-02-10 2 views
1

У меня есть 2 приложения для rails, один в Rails 2 (клиент) и один в Rails 4 (API).Добавление параметров в запрос GET

Проблема в том, что иногда у меня есть запросы GET с слишком длинным URI. API поднимает ERROR WEBrick::HTTPStatus::RequestURITooLarge исключение.

На данный момент у меня есть только три решения, которые мне не нравятся:

  • Transform GET запрос POST/PUT (любой запрос, имеющий тело в запросе). Мне это не нравится, потому что у значение «get» больше не имеет смысла. Я ничего не ставил, ничего не пишу, я получаю только информацию. http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html говорит:

    Метод GET означает получение любой информации (в форме объекта), идентифицируемой Request-URI. Если Request-URI ссылается на процесс создания данных, то полученные данные должны быть возвращены в качестве объекта в ответе, а не в исходном тексте процесса, если только этот текст не является результатом процесса.

  • Изменение значения по умолчанию MAX_URI_LENGTH (как http://kandadaboggu.com/post/40618627239/fixing-webrick-httpstatus-requesturitoolarge делает). Для меня это просто дрянной, и это не мешает быть достаточно большим.

  • Добавление моих параметров в headersHow do you add a custom http header?. Для меня это менее дрянное решение. Я не знаю, соответствует ли это стандарту, который можно легко переносить для API.

У вас есть решение? Если вы этого не сделаете, то чем менее дерьмовым?

ответ

0

Вы только реальный ограничение длина URI в случае, если вы используете URL-API в веб-браузере (2083 символов для Internet Explorer, KB208427).

Если вы получаете исключение WEBrick::HTTPStatus::RequestURITooLarge, и вы находитесь под лимитом символов 2,083, просто увеличьте значение MAX_URI_LENGTH. Эта константа существует прежде всего для того, чтобы ваше приложение не зашло в прошлое, отправив на него большие запросы. Вы можете столкнуться с подлинной необходимостью увеличить эту ценность.

Если вы превысили 2083 символа для длины URI, вам, вероятно, придется реорганизовать этот вызов службы на несколько вызовов службы (что не идеально), или вы можете изучить изменение параметров URL для сохранения в байтах.

Например, предположим, что вы должны предоставить список идентификаторов для какой-то связи базы данных:

foo[bar][0]=123&foo[bar][1]=535&foo[bar][2]=76456 

Это строки запроса сегмент имеет длину 49 символов. Сравните это с:

foo[bar]=123,535,76456 

Это всего 22 символа, что дает вам ~ 50% уменьшение символов. Вы можете посмотреть на микро оптимизацию, как это, если вы видите параметры строки запроса, которые повторяются несколько раз, или параметры с длинными именами.