Вы не должны использовать CGI: Escape ни по URL, ни по всей паре ключ-значение.Его следует использовать на ключе и отдельно на значении.Затем эти два будут объединены знаком равенства, а затем эти пары будут добавлены в строку запроса, разделенную символом & '.
Кстати, я вижу, что вы объединяетесь с'% 26 '(закодировано&).Кажется, это не соответствует спецификации, разве что ваши базовые значения не нуждаются в кодировании?Это было бы эквивалентно «кодированию» значений, а затем кодированию всей строки.И, возможно, именно поэтому квадратные скобки вызвали проблему - как только вы добавили их к значению, это значение затем необходимо было закодировать.
encoded_params = Map [params.map {|k, v| CGI.Escape(k), CGI.Escape(v)}]
.sort_by{|k,v| k.to_s}
.collect { |k, v| CGI.escape("#{k.to_s}=#{v}") }
.join('%26')
Я не рубиновый парень - я просто взялпример из ответа об обработке хеша и примененного здесь.Пожалуйста, сделайте то, что нужно сделать, чтобы сделать этот правильный код ruby.Я также сохранил остальную часть кода;хотя это может сбивать с толку, похоже, что это сработает.
Существует еще одна потенциальная проблема. Согласно спецификации, выполняемая кодировка URI может немного отличаться от обычной кодировки URI.Пробелы% 20 и не +, и все, кроме ALPHA, DIGIT, '_', '-', '.' И '~' должны быть закодированы, и эти значения не должны быть закодированы.Так это относится к CGI: Escape?У меня не установлен ruby, и моя быстрая проверка спецификации привела меня к однострочному документу.
edit: алгоритм выше не будет работать с вещами, которые нужно кодировать, потому что% 's из закодированных вещей будет также закодировано.Для кодирования всего значения требуется небольшая настройка, а не соединение с закодированными амперсандами.