如何修复不好的URI不是URI

我使用的Ruby版本1.9.3 ,我喜欢从下面的videourl获取主机名,

我试着用代码

 require 'uri' url = "https://ferrari-view.4me.it/view-share/playerp/?plContext=http://ferrari-%201363948628-stream.4mecloud.it/live/ferrari/ngrp:livegenita/manifest.f4m&cartellaConfig=http://ferrari-4me.weebo.it/static/player/config/&cartellaLingua=http://ferrari-4me.weebo.it/static/player/config/&poster=http://pusher.newvision.it:8080/resources/img1.jpg&urlSkin=static/player/swf/skin.swf&method=GET&target_url=static/player/swf/player.swf&userLanguage=IT&styleTextColor=#000000&autoPlay=true&bufferTime=2&isLive=true&highlightColor=#eb2323&gaTrackerList=UA-23603234-4" puts URI.parse(url).host 

它抛出一个exception的URI :: InvalidURIError:坏URI(不是URI?):

我试着编码URL然后像下面parsing

 puts URI.parse(URI.parse(url)).host 

它抛出一个exception相同的URI::InvalidURIError: bad URI(is not URI?)

但上面的代码适用于下面的URL。

url = http://www.youtube.com/v/GpQDa3PUAbU?version=3&autohide=1&autoplay=1

如何解决这个问题? 任何build议请。 谢谢

这个URL是无效的,但它在浏览器中工作,因为浏览器本身对特殊字符如:/等的要求不太严格

你应该先编码你的URI

 encoded_url = URI.encode(url) 

然后parsing它

 URI.parse(encoded_url) 

Addressable :: URI是一个更好,更符合rfc标准的URIreplace:

 require "addressable/uri" Addressable::URI.parse(url).host #=> "ferrari-view.4me.it" 

gem install addressable首先gem install addressable

您的URI查询无效。 有几个字符 ,你应该使用URI::encode() 。 例如, # 或者在查询中无效。

在你的代码的工作版本下面

  require 'uri' plContext = URI::encode("http://ferrari-%201363948628-stream.4mecloud.it/live/ferrari/ngrp:livegenita/manifest.f4m") cartellaConfig = URI::encode("http://ferrari-4me.weebo.it/static/player/config/") cartellaLingua = URI::encode("http://ferrari-4me.weebo.it/static/player/config/") poster = URI::encode("http://pusher.newvision.it:8080/resources/img1.jpg") urlSkin = URI::encode("static/player/swf/skin.swf") target_url = URI::encode("static/player/swf/player.swf") url = "https://ferrari-view.4me.it/view-share/playerp/?" url << "plContext=#{plContext}" url << "&cartellaConfig=#{cartellaConfig}" url << "&cartellaLingua=#{cartellaLingua}" url << "&poster=#{poster}" url << "&urlSkin=#{urlSkin}" url << "&method=GET" url << "&target_url=#{target_url}" url << "&userLanguage=IT" url << "&styleTextColor=#{URI::encode("#000000")}" url << "&autoPlay=true&bufferTime=2&isLive=true&gaTrackerList=UA-23603234-4" url << "&highlightColor=#{URI::encode("#eb2323")}" puts url puts URI.parse(url).host 

URI.parse是正确的:该URI是非法的。 仅仅因为它意外地在你的浏览器中工作,并不合法。 你不能parsing这个URI,因为它不是一个URI。

 uri = URI.parse(URI.encode(url.strip)) 

尝试这个:

 safeurl = URI.encode(url.strip) response = RestClient.get(safeurl) 
Interesting Posts