如何在 HTTP 查询字符串中发送 NULL?

How to send NULL in HTTP query string?

我正在开发一个 API,它可以接受主要的三种数据类型作为查询字符串参数的值:booleanstringnumeric (integerfloat)。默认情况下,所有内容都检索到一个字符串(我认为没有办法解决),但参数配置了一个类型,以便我将它们转换为正确的类型。

我现在需要开始接受 NULL 作为所有三种数据类型的值,但我不确定这样做的最佳方式是什么。

有些人似乎不接受任何值作为 NULL(?param,没有 =),但这对我来说不太有效:

  1. 我已经接受它作为布尔值的 true,尽管可以更改。
  2. 它作为空字符串接收,这是 string 数据类型的有效值。

所以,这是我能看到的仅有的两个选项,none 其中对我有用:

  1. 使用常量,例如 "NULL""~"。这适用于布尔值和数字,但不适用于字符串,因为这可能是所需的字符串值。
  2. 使用空值。再一次,这可以用于布尔值和数字,但不适用于字符串,因为这可能是所需的字符串值。

似乎使用常量可能是我唯一的选择,并且为了避免字符串中禁止使用常量的问题。但这真的是唯一可行的选择吗?我希望有更好的方法。 :(

Edit:我刚刚有了另一个可能可行的想法,但我不确定它会被如何看待。我认为它肯定违反了标准,而且很多人很可能不喜欢它,但会比迄今为止的任何其他解决方案更好地解决我的问题。基本上,想法是使用 JSON,它支持本机数据类型。 POST 请求没有这个问题,因为他们使用的是 JSON.

所以我们的想法是在查询字符串中使用 JSON,基本上允许一个替代的查询字符串来覆盖标准的 HTTP 字符串。类似于:?_json={"foo":"bar","param":null} 而不是 ?foo=bar&param=~。或者甚至可能完全接管查询字符串:?{"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 种可能性 属性:

  1. {"param":"foo"}
  2. {"param":""}
  3. 缺席{}
  4. {"param":null}

一个请求参数只能有3个:

  1. ?param=foo
  2. ?param=?param(服务器API通常不区分这两种情况)
  3. 缺席?

第 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%),并且对于所有其他参数,以相同的方式处理空参数和不存在的参数: 将其绑定到空值。