ruby - URL 编码每个可能的字符
问题描述
我在 Ruby 中发出请求失败的情况很常见,因为服务器不喜欢编码。一个常见的例子是+
当服务器只理解时有空格%20
。今天我遇到了一个不喜欢未编码连字符(-
)的服务器,%2D
而是要求。
我已经尝试过CGI.escape
, URI.escape
, ERB::Util.url_encode
, WEBrick::HTTPUtils.escape
, 并且没有人对连字符进行编码。
在过去,我gsub
根据需要求助于冒犯的角色,但随着我发现更多具有更多特质的服务器,我更喜欢更稳定的解决方案。
是否有一种标准(即没有外部依赖项)方法可以对所有可能的内容进行百分比编码?
我不是在寻找连字符编码或gsub
一次寻找所有内容。
解决方案
URI.escape
已被弃用,取而代之的CGI::escape
是通过抓取非字母数字字符并转换它们符合 RFC。这是执行此操作的模块:
# https://ruby-doc.org/stdlib-2.4.3/libdoc/cgi/rdoc/CGI/Util.html
# File cgi/util.rb, line 11
def escape(string)
encoding = string.encoding
string.b.gsub(/([^ a-zA-Z0-9_.-]+)/) do |m|
'%' + m.unpack('H2' * m.bytesize).join('%').upcase
end.tr(' ', '+').force_encoding(encoding)
end
归根结底,需要修复的是服务器,而不是您的代码。您可以monkeypatch 或fork CGI 并-
从正则表达式或gsub()
字符中删除。
推荐阅读
- javascript - JavaScript 中的 Java/Python 交叉编译
- vba - 如何将动态加载的无界子表单链接到主表单?
- python - Python 脚本返回空白输出
- c# - C# 类库导出为 COM,MIDL 编译时出错
- javascript - 使用 jQuery 将鼠标悬停在相邻文本上时更改图标的颜色
- javascript - 将下拉值拉入 Elementor 列
- c# - 只能在只写模式下请求附加访问
- ios - 在 iOS 中没有 cognito 的 Amazone aws KVS 视频流
- javascript - 在滚动 React.js 上更新 ID 标签
- python - 将 pandas df 加速到 sql 表