如何在 HTTP 查询字符串中发送 NULL?
How to send NULL in HTTP query string?
我正在开发一个 API,它可以接受主要的三种数据类型作为查询字符串参数的值:boolean
、string
和 numeric
(integer
或 float
)。默认情况下,所有内容都检索到一个字符串(我认为没有办法解决),但参数配置了一个类型,以便我将它们转换为正确的类型。
我现在需要开始接受 NULL 作为所有三种数据类型的值,但我不确定这样做的最佳方式是什么。
有些人似乎不接受任何值作为 NULL(?param
,没有 =
),但这对我来说不太有效:
- 我已经接受它作为布尔值的
true
,尽管可以更改。
- 它作为空字符串接收,这是
string
数据类型的有效值。
所以,这是我能看到的仅有的两个选项,none 其中对我有用:
- 使用常量,例如
"NULL"
或 "~"
。这适用于布尔值和数字,但不适用于字符串,因为这可能是所需的字符串值。
- 使用空值。再一次,这可以用于布尔值和数字,但不适用于字符串,因为这可能是所需的字符串值。
似乎使用常量可能是我唯一的选择,并且为了避免字符串中禁止使用常量的问题。但这真的是唯一可行的选择吗?我希望有更好的方法。 :(
Edit:我刚刚有了另一个可能可行的想法,但我不确定它会被如何看待。我认为它肯定违反了标准,而且很多人很可能不喜欢它,但会比迄今为止的任何其他解决方案更好地解决我的问题。基本上,想法是使用 JSON,它支持本机数据类型。 POST 请求没有这个问题,因为他们使用的是 JSON.
所以我们的想法是在查询字符串中使用 JSON,基本上允许一个替代的查询字符串来覆盖标准的 HTTP 字符串。类似于:?_json={"foo":"bar","param":null}
而不是 ?foo=bar¶m=~
。或者甚至可能完全接管查询字符串:?{"foo":"bar","param":null}
.
为您专门设置为空的任何内容发送一个URL编码的空值 (%00)。它应该被正确URL解码。
或者不发送任何值。在您的获取请求 url.. like -
中将查询参数值留空
API URL/?foo=&some_other_param=值
在 API 中 foo 将被接收为 null
使用 IIS 和 C#,我这样发送:
?param=#
在 edit 之后更清楚的用例中,我肯定会选择 ?_json=
参数,它没有任何问题,因为一切都适用于POST 正如您所写,毫无疑问,这比通过请求参数 (application/x-www-form-urlencoded
) 发明通用绑定协议要好。我个人一直在使用两个参数来支持其他内容类型,如 XML,一个 $rqc
携带像你的 _json
的内容,一个 $rqct
携带内容类型,例如:application/json
说,我认为 JSON 效果很好,因为它允许字符串有 4 种可能性 属性:
- 满
{"param":"foo"}
- 空
{"param":""}
- 缺席
{}
- 无
{"param":null}
一个请求参数只能有3个:
- 满
?param=foo
- 空
?param=
或?param
(服务器API通常不区分这两种情况)
- 缺席
?
第 4 种可能性,显式 null,可以方便地进行部分更新:如果只更新请求 JSON 对象中存在的字段;你不能轻易地用请求参数表达它。
但是,如果您不进行部分更新,您可能会将缺少的参数视为空值,但您需要知道该端点允许的所有参数,如果没有架构或其他规范(a class 绑定到);既然你说你将参数与类型相关联,那么你可能拥有它。
ASP.NET(我现在从答案中了解到)不区分空参数和不存在参数这一事实提醒我,允许空字符串 and/or 以不同于absent/null 字符串,例如因为对于 Oracle 空字符串被转换为 null,所以对于 NOTNULL 列无效(在 mysql 中是可以的),参见 null vs empty string in Oracle.
因此,如果您不需要支持空字符串和 null/absent 字符串之间的区别,您也可以将空参数视为 null。
如果您想使用请求参数重新创建 JSON {"param":null}
的第 4 点,则必须使用约定,例如按照答案中的建议传递 %00
或使用 null marker参数我稍后提出。
如果目的是创建通用的东西,我不会使用 %00
因为某些服务器可能启用了一些 参数清理 机制:如果它拒绝 %00
(因为它可能应该)那么约定就无法工作。我现在检查了一下,JSOUP 删除了 %00-%0F
范围内的所有内容。也许 ASP.net 默认情况下也是如此,请参阅 Special character causes "A potentially dangerous Request.Form value"
更 HTML 的方法可以使用额外的 空标记参数 其名称由带有后缀的原始参数获得,例如:来自 param
可能是 param$null
:如果参数存在则绑定值为 null,无论 param
的值是什么,这就像把 unset文本输入前的复选框,并在选中时取消设置绑定值。此外,如果您有某种方法来注释 parameter/property 以支持此语法,您可能会限制对这些参数的检查(可能少于总数的 1%),并且对于所有其他参数,以相同的方式处理空参数和不存在的参数: 将其绑定到空值。
我正在开发一个 API,它可以接受主要的三种数据类型作为查询字符串参数的值:boolean
、string
和 numeric
(integer
或 float
)。默认情况下,所有内容都检索到一个字符串(我认为没有办法解决),但参数配置了一个类型,以便我将它们转换为正确的类型。
我现在需要开始接受 NULL 作为所有三种数据类型的值,但我不确定这样做的最佳方式是什么。
有些人似乎不接受任何值作为 NULL(?param
,没有 =
),但这对我来说不太有效:
- 我已经接受它作为布尔值的
true
,尽管可以更改。 - 它作为空字符串接收,这是
string
数据类型的有效值。
所以,这是我能看到的仅有的两个选项,none 其中对我有用:
- 使用常量,例如
"NULL"
或"~"
。这适用于布尔值和数字,但不适用于字符串,因为这可能是所需的字符串值。 - 使用空值。再一次,这可以用于布尔值和数字,但不适用于字符串,因为这可能是所需的字符串值。
似乎使用常量可能是我唯一的选择,并且为了避免字符串中禁止使用常量的问题。但这真的是唯一可行的选择吗?我希望有更好的方法。 :(
Edit:我刚刚有了另一个可能可行的想法,但我不确定它会被如何看待。我认为它肯定违反了标准,而且很多人很可能不喜欢它,但会比迄今为止的任何其他解决方案更好地解决我的问题。基本上,想法是使用 JSON,它支持本机数据类型。 POST 请求没有这个问题,因为他们使用的是 JSON.
所以我们的想法是在查询字符串中使用 JSON,基本上允许一个替代的查询字符串来覆盖标准的 HTTP 字符串。类似于:?_json={"foo":"bar","param":null}
而不是 ?foo=bar¶m=~
。或者甚至可能完全接管查询字符串:?{"foo":"bar","param":null}
.
为您专门设置为空的任何内容发送一个URL编码的空值 (%00)。它应该被正确URL解码。
或者不发送任何值。在您的获取请求 url.. like -
中将查询参数值留空API URL/?foo=&some_other_param=值
在 API 中 foo 将被接收为 null
使用 IIS 和 C#,我这样发送:
?param=#
在 edit 之后更清楚的用例中,我肯定会选择 ?_json=
参数,它没有任何问题,因为一切都适用于POST 正如您所写,毫无疑问,这比通过请求参数 (application/x-www-form-urlencoded
) 发明通用绑定协议要好。我个人一直在使用两个参数来支持其他内容类型,如 XML,一个 $rqc
携带像你的 _json
的内容,一个 $rqct
携带内容类型,例如:application/json
说,我认为 JSON 效果很好,因为它允许字符串有 4 种可能性 属性:
- 满
{"param":"foo"}
- 空
{"param":""}
- 缺席
{}
- 无
{"param":null}
一个请求参数只能有3个:
- 满
?param=foo
- 空
?param=
或?param
(服务器API通常不区分这两种情况) - 缺席
?
第 4 种可能性,显式 null,可以方便地进行部分更新:如果只更新请求 JSON 对象中存在的字段;你不能轻易地用请求参数表达它。
但是,如果您不进行部分更新,您可能会将缺少的参数视为空值,但您需要知道该端点允许的所有参数,如果没有架构或其他规范(a class 绑定到);既然你说你将参数与类型相关联,那么你可能拥有它。
ASP.NET(我现在从答案中了解到)不区分空参数和不存在参数这一事实提醒我,允许空字符串 and/or 以不同于absent/null 字符串,例如因为对于 Oracle 空字符串被转换为 null,所以对于 NOTNULL 列无效(在 mysql 中是可以的),参见 null vs empty string in Oracle.
因此,如果您不需要支持空字符串和 null/absent 字符串之间的区别,您也可以将空参数视为 null。
如果您想使用请求参数重新创建 JSON {"param":null}
的第 4 点,则必须使用约定,例如按照答案中的建议传递 %00
或使用 null marker参数我稍后提出。
如果目的是创建通用的东西,我不会使用 %00
因为某些服务器可能启用了一些 参数清理 机制:如果它拒绝 %00
(因为它可能应该)那么约定就无法工作。我现在检查了一下,JSOUP 删除了 %00-%0F
范围内的所有内容。也许 ASP.net 默认情况下也是如此,请参阅 Special character causes "A potentially dangerous Request.Form value"
更 HTML 的方法可以使用额外的 空标记参数 其名称由带有后缀的原始参数获得,例如:来自 param
可能是 param$null
:如果参数存在则绑定值为 null,无论 param
的值是什么,这就像把 unset文本输入前的复选框,并在选中时取消设置绑定值。此外,如果您有某种方法来注释 parameter/property 以支持此语法,您可能会限制对这些参数的检查(可能少于总数的 1%),并且对于所有其他参数,以相同的方式处理空参数和不存在的参数: 将其绑定到空值。