Pregunta ¿Cómo puedo establecer un esquema para un objeto URI en Ruby?


Estoy tratando de analizar un URI de la entrada del usuario. Supongo que algunos usuarios no colocarán el esquema en sus URI y quiero establecer de forma predeterminada "http".

El siguiente código no funciona:

require 'uri'   

uri_to_check = URI::parse("www.google.com")
uri_to_check.scheme = "http" unless uri_to_check.scheme

puts uri_to_check.to_s

Espero ver "http://www.google.com"pero me aparece" http: www.google.com ". ¿Es posible hacerlo de esta manera?

Si es así, ¿qué me estoy perdiendo?

¿Hay una mejor manera de hacer esto?


14
2017-10-02 12:21


origen


Respuestas:


Las barras inclinadas principales (//) indican que la URL es una dirección basada en IP, y se necesitan para marcar el nombre de host para que el URI pueda analizarlos correctamente.

Wikipedia tiene algunas buenas descripciones y ejemplos de uso:

http://en.wikipedia.org/wiki/Url , http://en.wikipedia.org/wiki/URI_scheme , http://en.wikipedia.org/wiki/URL_normalization

La mejor información está en la especificación misma: http://www.ietf.org/rfc/rfc1738.txt particularmente en la sección 3.1 "3.1. Sintaxis común del esquema de Internet".

Es posible que desee considerar el uso de la gema direccionable. Es más inteligente y es lo que uso cuando necesito hacer muchos análisis URI o manipulación.

http://addressable.rubyforge.org/ y http://addressable.rubyforge.org/api/Addressable/URI.html


15
2017-10-02 18:50



Cuando la cadena que desea analizar no conlleva un esquema, URI no lo reconoce como nombre de host:

irb(main):001:0> require 'uri'
=> true
irb(main):002:0> uri = URI::parse("www.google.com")
=> #<URI::Generic:0x11cfc88 URL:www.google.com>
irb(main):003:0> uri.path
=> "www.google.com"
irb(main):004:0> uri.host
=> nil

Cuando configura el esquema como lo hace en su ejemplo y luego llama to_s el URI está construido sin el host ...

Puede intentar algo como lo siguiente: (Eso es un truco rápido, no sé el URI detalles ...)

uri = URI::parse("www.google.com")
if uri.scheme.nil? && uri.host.nil?
  unless uri.path.nil?
    uri.scheme = "http"
    uri.host = uri.path
    uri.path = ""
  end
end

puts uri.to_s

4
2017-10-02 17:51