URL参数和查询字符串有什么区别?

151

我认为URL中的参数和查询字符串之间并没有太大的区别。那么这两者之间有什么区别,什么时候应该使用其中的一种?


2
你有上下文吗?因为据我所知,这两个术语通常用于相同的情况 - 但你的情况可能是特定于上下文的。 - Allan S. Hansen
我没有具体的上下文,这是一个普遍性问题。在什么情况下应该使用其中一种而不是另一种。这两种方法肯定有不同的用途。 - koninos
个人而言,当在变量或方法调用上下文中谈论它们时,我大多使用“参数”这个词,而在URL上下文中谈论它们时则使用“查询字符串”(例如:查询字符串被拆分为方法的参数)。但这只是语言问题,因此上下文和情况不同,我怀疑任何人都不会因为你“感觉”使用其中任何一个而追究你的责任 :)。 - Allan S. Hansen
5个回答

123

查询组件由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

(查询组件中允许的字符列表)

查询组件的“格式”由URI作者决定。一个常见的约定(但就URI标准而言,仅仅是一种约定¹)是使用查询组件来进行键值对,也就是参数,就像上面的最后一个例子中所示:bar1=a&bar2=b

这样的参数也可以出现在其他URI组件中,即路径²和片段。就URI标准而言,你可以自己选择使用哪个组件和哪种格式。

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

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

¹ URI标准关于查询组件的说明:

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

² URI标准关于路径组件的说明:

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


1
参数和查询是不同的。请参见https://tools.ietf.org/html/rfc2396.html中的第3.3节和第3.4节。 - cowlinator
1
@cowlinator:(RFC 2396已经过时,但当前标准RFC 3986在path component中也有类似的规定)。我没有说它们是相同的,或者我说了吗?URI作者可以在查询组件中指定参数(如我的答案所述),他们也可以在路径组件中指定参数(如您的参考所述)-- 在这两种情况下,这只是一种约定,而不是标准定义的内容。--您是否建议修改我的答案?您认为OP是指路径中的参数吗? - unor
您还可以在以下地址找到查询组件:https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#query - georgesjeandenis
你还可以在这个地址找到查询组件:https://zh.wikipedia.org/wiki/统一资源标识符#查询 - undefined

50
参数是键值对,可以出现在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 参数的服务器代码中使用。
在您获得更好的见解之前,我建议您仅在 POST 请求的 form-data 数据流中使用参数。
来源:每位开发人员都应该知道的URL知识

RFC 3986


很好的澄清!这里有一个使用Python及其urllib库的示例:urllib.parse.urlparse("https://www.google.com/search?q=url+param+vs+query+parameters+python+urllib&newwindow=1") ParseResult(scheme='https', netloc='www.google.com', path='/search', params='', query='q=url+param+vs+query+parameters+python+urllib&newwindow=1', fragment='') - TaiwanGrapefruitTea

17

两种方式都是通过GET请求传递数据的方式。以下是一些区别:

参数/查询参数/URL参数:

https://localhost:3000/user/5896544

后端访问:

request.params.userId = 5896544

查询字符串:

https://localhost:3000/user?userId=5896544

后端访问:

request.query.userId = 5896544


1

我猜想在命名上并没有全球性的共识,因为我看到了好几篇文章,它们使用不同的术语来指代同一个概念。

所以,从我的角度来看,我会这样认为:

URL 参数: 出现在 URL 中的任何参数。它们有多种不同的形式:

  • 路径路由参数:是 URL 路径的一部分的值。
    • 例如:https://dev59.com/m1kS5IYBdhLWcg3w8acM,其中 39266970 就是问题的 ID。
  • 查询字符串参数:是出现在 URL 路径之后问号?之后的键值对。
    • 例如:https://dev59.com/m1kS5IYBdhLWcg3w8acM?slowClient=true,可以通过该参数编程客户端计算机,在运行缓慢的计算机上运行特定的浏览器操作。

还有一种叫做锚点的东西,它是另一个参数,它指示浏览器在着陆给定页面时要关注哪个部分。例如:https://www.i18next.com/translation-function/plurals#interval-plurals(导航,等待页面完全加载,然后看浏览器如何直接转到网页的那一部分)


-1

路径参数 vs 查询参数

假设我们有基本URL https://gov.philippines.com,路径参数示例如下:

https://gov.philippines.com/sign-up
https://gov.philippines.com/sign-in

基本上路径参数是/sign-up/sign-in,简而言之,它是base-url中扩展的路径,而查询参数则是;

https://gov.philippines.com/sign-up?for=membership
https://gov.philippines.com/sign-in?as=admin

?for=membership?as=admin 是带有 keyvalue 的查询参数,其主要用例是为了过滤请求。


不对,"https://gov.philippines.com/sign-up" 是路径。参数可以在服务器端访问,并在路由中通过":"进行定义。例如,/cities/:cityId。然后,如果客户端使用GET请求访问https://gov.philippines.com/cities/1,服务器将通过参数获取"1",而不是路径。例如,在express.js中,在路由/cities/:cityId中使用req.param,GET请求https://gov.philippines.com/cities/1将解析为{ cityId: 1 }。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接