问题标签 [rfc3986]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
uri - 什么时候,如果有的话,像 { 和 }(花括号)这样的字符应该在 URL 中进行百分比编码吗?
根据RFC 3986,以下字符是保留的,需要进行百分比编码才能在 URI 中使用,而不是作为保留用途:
:/?#[]@!$&'()*+,;=
此外,它指定了一些特别未保留的字符:a-zA-Z0-9\-._~
似乎很清楚,通常应该对保留字符进行编码(以防止误解)而不是对未保留的字符进行编码(为了便于阅读),但是不属于任一类别的字符应该如何处理呢?例如{
并且}
不在任一列表中出现,但它们是标准的 ASCII 字符。
向现代浏览器寻求指导,似乎它们有时具有不同的行为。例如,考虑将 URL 粘贴https://www.google.com/search?q={
到 Web 浏览器的地址栏中:
- Chrome 34.0.1847.116 m 不会改变它。
- Firefox 28.0 没有改变它。
- Internet Explorer 9.0 不会改变它。
- Safari 5.1.7 将其更改为
https://www.google.com/search?q=%7B
但是,如果粘贴https://www.google.com/#q={
(删除“搜索”并将 更改?
为 a #
,使字符成为片段/哈希的一部分而不是查询字符串),我们会发现:
- Chrome 34.0.1847.116 m 将其更改为
https://www.google.com/#q=%7B
(通过 JavaScript) - Firefox 28.0 没有改变它。
- Internet Explorer 9.0 不会改变它。
- Safari 5.1.7 将其更改为
https://www.google.com/#q=%7B
(在执行 JavaScript 之前)
此外,当使用 JavaScript 异步执行请求时(即使用这个 MDN 示例修改为使用 的 URL ?q={
),URL 不会自动进行百分比编码。(我猜这是因为 XMLHttpRequest API 假设 URL 是预先编码/转义的。)
我想(出于与奇怪的客户要求相关的原因)在 URL 的文件名部分中使用{
和,而不会(1)破坏事物,理想情况下也不会(2)在现代网络面板中创建难看的百分比编码条目}
浏览器的网络检查器/调试器。
java - Java URL 类 getPath()、getQuery() 和 getFile() 与 RFC3986 URI 语法不一致
我正在编写一个半包装 Java 的实用程序类URL class
,并且我编写了一堆测试用例来验证我用自定义实现包装的方法。我不理解某些 Java 的某些URL
字符串的 getter 的输出。
根据 RFC 3986 规范,路径组件定义如下:
查询组件定义如下:
我有几个测试用例被 Java 视为有效的 URL,但是路径、文件和查询的 getter 不会返回我预期的值:
上面的结果如下:
我的另一个测试用例:
上面的结果如下:
根据 Java 的文档URL
:
所以,我的测试用例在getQuery()
被调用时会产生空字符串。在这种情况下,我希望getFile()
返回与getPath()
. 不是这种情况。
我曾期望两个测试用例的输出如下:
也许我对 RFC 3986 的解释是不正确的。但是我看到的输出也不符合 URL 类的文档?谁能解释我所看到的?
rfc3986 - 在 RFC3986 的上下文中,术语“path-abempty”中的“abempty”是什么意思?
见:https ://www.rfc-editor.org/rfc/rfc3986#section-3
并且:https ://www.rfc-editor.org/rfc/rfc3986#section-3.3
“abempty”的起源对我来说很神秘,快速搜索并没有找到它的任何定义。
web - 为什么我们有两个查询参数的分隔符?
我们都知道查询字符串有 2 个分隔符。是?
和&
。为什么我们不只?
对这两种情况都使用?为什么我们需要&
RFC 3986给出了标准的描述,但没有为我们提供关于该主题的动力。
查询组件由第一个问号 ("?") 字符指示,并以数字符号 ("#") 字符或 URI 结尾终止。
android - 带有连字符的 URL 无法使用 Android 浏览器打开
我遇到了一个非常奇怪的问题。网址如http://wei-.x.yupoo.com
可以用Windows PC、macOS、iOS浏览器打开,但不能用Android浏览器打开,会报DNS错误。
谁能帮我弄清楚为什么?我在 RFC3986 sec 3.1 中检查了 RFC7320 和 RFC3986
方案名称由一系列字符组成,以
字母开头,后跟字母、数字、加号
("+")、句点 (".") 或连字符 ("-") 的任意组合。尽管方案
不区分大小写,但规范形式是小写的,并且
指定方案的文档必须使用小写字母。一个实现应该接受大写字母作为方案名称中的小写字母
(例如,允许“HTTP”以及“http”),以保持
稳健性,但应该只产生小写的方案名称以
保持一致性。
似乎这个网址应该没问题。
url - 在查询字符串中使用逗号可能产生副作用?
我想,
在 URL 查询字符串值中使用,但它是保留字符。但是,我们可以看到现在许多电子商务网站都提供逗号丰富的查询字符串 URL。
我们,
在查询字符串中使用时要考虑什么?它应该像%2c
往常一样编码吗?
请注意,我的服务器端框架是 ASP.NET WebApi、dJango 和 Node.js。
url - remove_dot_segments 似乎将相对路径转换为绝对路径
Std 66 的“5.2.4. Remove Dot Segments”解释了如何将带.
和不带的路径转换..
为不带的路径。
IIUC,输入foo/../bar
处理如下。
- 在第 1 步中,(输入缓冲区,输出缓冲区)被初始化为 (
"foo/../bar"
,""
) - Step 2.E 用于得到 (
"/../bar"
,"foo"
) - 步骤 2.C 用于得到 (
"/bar"
,""
) - Step 2.E 用于得到 (
""
,"/bar"
) - 第 2 步循环退出
- 根据第 3 步,结果为
/bar
。
输入是相对路径,但输出是绝对路径,这对我来说似乎很奇怪。
在我看来,这可以通过在步骤 1中将 isAbsolute设置为 true 来解决,前提是输入缓冲区以 a 开头/
并将步骤 2.C 从
C. 如果输入缓冲区以前缀“/../”或“/..”开头,其中“..”是完整的路径段,则在输入缓冲区中将该前缀替换为“/”并删除来自输出缓冲区的最后一段及其前面的“/”(如果有);否则,
至
C. 如果输入缓冲区以前缀“/../”或“/..”开头,其中“..”是完整的路径段,则在输入缓冲区中将该前缀替换为“/”并删除输出缓冲区的最后一段及其前面的“/”(如果有),如果不是isAbsolute并且输出缓冲区为空,则从输入缓冲区的前面删除“/”;否则,
我误读了规范吗?由于某种原因我没有看到,这是理想的结果吗?
我将一个要点与我对规范的理解和我提出的“修复”的 Java 实现放在一起。
swift - 对 URL(string:) 有效但对 URLComponents(string:) 无效的字符串的示例是什么?
URL(string:)
如果字符串不代表 RFC 1808 中定义的 URL,Foundation 的初始化程序可能会失败。
URLComponents(string:)
如果字符串不代表 RFC 3986 中定义的 URL,则初始化程序可能会失败。
什么是URL(string:)
返回 a的字符串的示例URL
,但URLComponents(string:)
返回的字符串是nil
什么?(是否存在根据 RFC 1808 有效但根据 RFC 3986 无效的 URL 字符串?)