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

时间:2015-07-06 19:53:28

标签: http standards

我开发的API可以接受主要的三种数据类型作为查询字符串参数的值:booleanstring& numericintegerfloat)。默认情况下,所有内容都会被检索到一个字符串(我不认为那里有一种方法),但参数配置了一个类型,以便我将它们转换为正确的类型。

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

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

  1. 我已经接受了true作为布尔值,虽然可以改变。
  2. 它是一个空字符串,它是string数据类型的有效值。
  3. 所以,这是我能看到的唯一两个选项,其中没有一个对我有用:

    1. 使用常量,例如"NULL""~"。这适用于布尔和&数字,但不是字符串,因为它可能是所需的字符串值。
    2. 使用空值。再一次,这对布尔人来说是可行的。数字,但不是字符串,因为它可能是所需的字符串值。
    3. 似乎使用常量可能是我唯一的选择,并避免可以从字符串中禁止常量的问题。但这真的是唯一可行的选择吗?我希望有更好的方法。 :(

      编辑 :我刚才有了另一个可能有用的想法,但我不确定如何看待它。我认为它肯定会违反标准,很多人很可能不会喜欢它,但到目前为止,我的问题会比任何其他解决方案更好。基本上,我们的想法是使用支持本机数据类型的JSON。我对POST请求没有这个问题,因为他们正在使用JSON。

      因此,我们的想法是在查询字符串中使用JSON,基本上允许使用替代查询字符串来覆盖标准HTTP字符串。类似于:?_json={"foo":"bar","param":null}而不是?foo=bar&param=~。或者甚至可以完全接管查询字符串:?{"foo":"bar","param":null}

5 个答案:

答案 0 :(得分:13)

为您特别设置为null的任何内容发送URLEncoded NUL值(%00)。它应该是正确的URL解码。

答案 1 :(得分:1)

或者只是不发送任何值..在您的获取请求网址中将查询参数值留空..像-

API URL /?foo =&some_other_param = value

API foo中的

将被接收为空

答案 2 :(得分:0)

使用?isactive=#在ASP.NET Web Api端点的查询字符串中发送NULL

我使用C#和IIS对其进行了测试,并且@Ariel告诉我,效果很好。

[HttpGet]
public object Query(bool? isactive = true)
{
   var result = dbContext.Entities.Where(e => (isactive == null || e.IsActive.Equals(isactive.Value))).ToList();
   return result;
}

答案 3 :(得分:0)

edit 之后,您的用例将更加清楚,我肯定会使用?_json=参数,它没有任何问题,并且因为在您编写该参数时一切都适用于POST毫无疑问,这比通过请求参数(application/x-www-form-urlencoded)发明通用绑定协议更好。我个人一直在使用两个参数来支持其他内容类型,例如XML,一个$rqc携带类似您的_json的内容,一个$rqct携带内容类型,例如:{{1 }}

说,我认为JSON效果很好,因为它允许为字符串属性提供4种可能性:

  1. 填充了application/json
  2. {"param":"foo"}
  3. 缺席{"param":""}
  4. {}

请求参数只能包含3:

  1. 填充了{"param":null}
  2. ?param=foo?param=(服务器API通常不会区分这两种情况)
  3. 缺席?param

第四个可能性,显式null,对于部分更新很方便:如果仅更新请求JSON对象中存在的字段;您无法使用request参数轻松地表达这一点。

但是,如果您不进行部分更新,则可以将不存在的参数视为空值,但是您需要知道该端点允许的所有参数,如果没有模式或其他规范(绑定到);因为您说过将参数与类型相关联,所以很可能拥有它。

ASP.NET(我现在从答案中了解到)不能区分空参数和不存在参数,这一事实提醒我,允许空字符串和/或与不存在/空字符串区别对待通常很危险,例如,因为对于Oracle,空字符串将转换为null,所以对于NOTNULL列无效(在mysql中可以),请参见null vs empty string in Oracle

因此,如果您不需要支持empty和null / absent字符串之间的区别,您也可以将empty参数视为null。

如果相反,您想使用请求参数重新创建JSON ?的第4点,则必须使用约定,如建议的那样传递{"param":null}(如果我不这样做,我也从未考虑过)包含该请求被拒绝或截断的请求会感到惊讶)。

更类似于HTML的方法可能是使用额外的空标记参数,其名称是通过带有后缀的原始参数获得的,例如:从%00起,其名称可能是{{1 }}:如果存在该参数,则绑定值为null,无论param的值是什么,就像在文本输入之前放置 unset 复选框并取消设置绑定值一样何时检查。此外,如果您有某种方法可以注释参数/属性以支持此语法,则可以将检查范围限制为那些参数(可能少于总数的1%),而对于所有其他参数,则以相同的方式对待空参数和不存在参数:绑定它为空值。

答案 4 :(得分:-2)

使用IIS和C#,我以这种方式发送它:

?param=#