gpt4 book ai didi

ruby - 解析带有花括号的 URI,URI::InvalidURIError: bad URI(is not URI?)

转载 作者:数据小太阳 更新时间:2023-10-29 08:24:37 32 4
gpt4 key购买 nike

使用 ruby 1.9.2-p290。我在尝试解析如下 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 一起使用,并且不会抛出任何错误。

最佳答案

# 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,所以最好将其完全替换为 URI#parse 方法。此外,这避免了每次都为新 Parser 对象的实例化分配内存。

关于ruby - 解析带有花括号的 URI,URI::InvalidURIError: bad URI(is not URI?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8845661/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com