如何修复不好的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)