2012-01-13 6 views
2

Использование ruby ​​1.9.2-p290. Я наткнулся на вопрос, пытаясь разобрать URI, как следующее:Разбор URI, имеющих фигурные скобки, URI :: InvalidURIError: плохой URI (не URI?)

require 'uri' 
my_uri = "http://www.anyserver.com/getdata?anyparameter={330C-B5A2}" 
the_uri = URI.parse(my_uri) 

, выполнив следующую ошибку:

URI::InvalidURIError: bad URI(is not URI?) 

мне требуется другое решение, чем при кодировании в фигурных скобках каждый раз, как это:

new_uri = URI.encode("http://www.anyserver.com/getdata?anyparameter={330C-B5A2}") 
=> "http://www.anyserver.com/getdata?anyparameter=%7B330C-B5A2%7D" 

Теперь я могу разобрать new_uri, как обычно, но должен был делать это каждый раз, когда мне это нужно. Каков самый простой способ достичь этого, не делая этого каждый раз?

Я отправляю свое решение, поскольку я не видел его точно так, как я его решил.


# Accepts URIs when they contain curly braces 
# This overrides the DEFAULT_PARSER with the UNRESERVED key, including '{' and '}' 
module URI 
    def self.parse(uri) 
    URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + "\{\}").parse(uri) 
    end 
end 

Теперь я могу использовать URI.parse (Uri) с URI, содержащие фигурные скобки и не отбрасывается никакой ошибки.

+0

Зачем вам разбирать его с помощью URI? Вы делаете другие манипуляции с URL с URI, или есть другие параметры, которые необходимо закодировать? –

+0

Да, в основном я модифицировал драгоценный камень, который его широко использует и заменяет весь этот код, не очень приятный, поэтому я предпочел изменить поведение разбора URI # в одном месте :) –

ответ

5
# Need to not fail when uri contains curly braces 
# This overrides the DEFAULT_PARSER with the UNRESERVED key, including '{' and '}' 
# DEFAULT_PARSER is used everywhere, so its better to override it once 
module URI 
    remove_const :DEFAULT_PARSER 
    unreserved = REGEXP::PATTERN::UNRESERVED 
    DEFAULT_PARSER = Parser.new(:UNRESERVED => unreserved + "\{\}") 
end 

Следуя той же самой проблеме, так как DEFAULT_PARSER используется повсюду, его лучше заменить его полностью InstEd просто для URI #. Кроме того, это позволяет избежать выделения памяти для создания нового объекта Parser каждый раз.

+0

Вы должны принять ваш ответ. Он работает, спасибо! – mydoghasworms

2

RFC 1738 - http://www.faqs.org/rfcs/rfc1738.html означает, что вы должны кодировать скобки

Thus, only alphanumerics, the special characters "$-_.+!*'(),", and 
reserved characters used for their reserved purposes may be used 
unencoded within a URL. 
+0

спасибо !, но у меня не было много выбор, поскольку uri был предоставлен внешней службой, которая точно не соответствовала RFC, поэтому в любом случае использовались фигурные скобки :) –

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

  • Нет связанных вопросов^_^