【问题标题】:What is the difference between URL parameters and query strings?URL参数和查询字符串有什么区别?
【发布时间】:2017-01-09 01:39:15
【问题描述】:

我在 URL 中看不到参数和查询字符串之间有太大区别。那么有什么区别,什么时候应该使用一个而不是另一个呢?

【问题讨论】:

  • 你有上下文吗,因为据我所知,这两者通常用于相同的 - 但你的情况可能是特定于上下文的。
  • 我没有具体的上下文,是一个普遍的问题。在什么情况下我应该使用一种方式而不是另一种方式。这两者一定有不同的用途。
  • 就我个人而言 - 我主要在变量或方法调用上下文中使用参数一词,在 URL 上下文中讨论它们时使用查询字符串。 (例如:查询字符串被拆分为方法的参数)。但这只是语言,所以上下文和情况不同,我怀疑当你“感觉”喜欢它时,有人会因为使用其中任何一种而追捕你:)。

标签: url query-string url-parameters


【解决方案1】:

query component 由 URI 中的第一个 ? 指示。 “查询字符串”可能是同义词(URI 标准中未使用该术语)。

一些带有查询组件的 HTTP URI 示例:

http://example.com/foo?bar
http://example.com/foo/foo/foo?bar/bar/bar
http://example.com/?bar
http://example.com/?@bar._=???/1:
http://example.com/?bar1=a&bar2=b

(list of allowed characters in the query component)

查询组件的“格式”取决于 URI 作者。一个常见的约定 (but nothing more than a convention, as far as the URI standard is concerned¹) 是将查询组件用于键值对,也就是。 参数,如上面最后一个示例:bar1=a&bar2=b

此类参数也可能出现在其他 URI 组件中,即路径²和片段。就 URI 标准而言,由您决定使用哪个组件和使用哪种格式。

在路径、查询和片段中带有参数的示例 URI:

http://example.com/foo;key1=value1?key2=value2#key3=value3

¹ URI 标准是 about the query component:

[...] 查询组件通常用于以“key=value”对的形式携带识别信息 [...]

² URI 标准是 about the path component:

[…] 分号 (";") 和等号 ("=") 保留字符通常用于分隔适用于该段的参数和参数值。逗号 (",") 保留字符通常用于类似目的。

【讨论】:

  • 参数和查询不同。请参阅tools.ietf.org/html/rfc2396.html中的第 3.3 和 3.4 节
  • @cowlinator:(RFC 2396 已过时,但当前标准 RFC 3986 对path component 中的参数有类似的规定)。我没有说它们是一样的,或者是吗? URI 作者可以在查询组件中指定参数(如我的回答中所述),他们还可以在路径组件中指定参数(如您的参考中所述)——在这两种情况下,这只是一个约定,没有标准定义的内容。 ——你会建议改变我的答案吗?你认为 OP 是指路径中的参数吗?
【解决方案2】:

参数是可以出现在 URL 路径中的键值对,以分号字符 (;) 开头。

查询字符串出现在路径之后(如果有),并以问号字符 (?) 开头。

参数和查询字符串都包含键值对。

GET 请求中,参数出现在 URL 本身中:

<scheme>://<username>:<password>@<host>:<port>/<path>;<parameters>?<query>#<fragment>

POST 请求中,参数可以出现在 URL 本身中,也可以出现在数据流中(称为内容)。

查询字符串始终是 URL 的一部分。

使用 POST 方法时,参数可以隐藏在 form-data 数据流中,因此它们可能不会出现在 URL 中。是的,POST 请求可以在 URL 中将参数定义为表单数据,这并不矛盾,因为参数可以有多个值。

到目前为止,我还没有找到任何关于这种行为的解释。我想有时从POST 请求中“取消隐藏”参数可能很有用,或者甚至让处理GET 请求的代码与处理POST 的代码共享某些部分。当然,这只适用于支持 URL 中的参数的服务器代码。

在您获得更好的见解之前,我建议您仅在 form-data 数据流的 POST 请求中使用参数。

来源:

What Every Developer Should Know About URLs

RFC 3986

【讨论】:

  • 很好的说明!以下是 python 及其 urllib 库的示例: urllib.parse.urlparse( "google.com/…" ) ParseResult(scheme='https', netloc='www.google.com', path='/search', params=' ', query='q=url+param+vs+query+parameters+python+urllib&newwindow=1', fragment='')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 2016-06-02
  • 2011-11-13
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
相关资源
最近更新 更多