从Web服务调用返回空值

时间:2020-03-06 14:54:14  来源:igfitidea点击:

我有一个Web服务API。某些调用返回包含文本字段的对象,这些文本字段包含用户提供的信息。从设计和安全的角度来看,当没有提供任何信息时,在这些字段中返回null有何不利之处?始终返回一个空字符串是否有明显的优势,而不是通过不需要客户端代码检查null来简化API,这是否有明显的优势?

解决方案

我不认为返回null与返回空字符串有关的安全问题。

对于那些没有任何信息表示空值表示的字段,返回空值没有任何实际的缺点。

我们可以通过使用简化客户端代码

string.IsNullOrEmpty()

(假设这是.NET)

这完全取决于我们是否将空字符串值在语义上与空字符串区别对待。

如果null和empty string都表示该字段没有数据,那么我没有理由不通过检查和返回空字符串来简化客户端的工作。

空值仅表示空值。那里没有固有的安全性问题。

由于Web服务是公共API,因此我们应严格检查所有输入数据,并期望发生格式错误的输入。我们永远不能假设客户端代码做对了,并且不会(恶意或者以其他方式)不向我们发送null。

因此,Empty字符串或者其他哨兵值不会使我们免于检查输入,它们也不一定使生活更轻松。语义上空的字符串也不是null,而是空的。

就其价值而言,.net SoapFormatter为null生成的xml简直就是一无所有,并且与空字符串不同。这是一个简单的例子,但内容丰富。如果发送null,则发送的数据也较少,这可能是要考虑的问题。

{
    [WebMethod]
    public MyClass HelloWorld() 
    {
        MyClass val = new MyClass()
        {
            IsValid = false,
            HelloString = "Hello World",
            BlankString = "",
            Nested = new NestedClass { Name = "Bob" }
        };

        return val;
    }

}

public class MyClass
{
    public bool IsValid { get; set; }
    public string HelloString { get; set; }
    public string BlankString { get; set; }
    public string OtherString { get; set; }
    public NestedClass Nested { get; set; }
    public NestedClass NullNested { get; set; }
}

public class NestedClass
{
    public string Name { get; set; }
}

产生以下xml响应。注意响应中的" OtherString"和" NullNested"是如何完全丢失的,这与" BlankString"不同。

<MyClass>
  <IsValid>false</IsValid> 
  <HelloString>Hello World</HelloString> 
  <BlankString /> 
  <Nested>
    <Name>Bob</Name> 
  </Nested>
</MyClass>

简短答案:请不要在网络服务中使用null。

通常,除非含义是零个字符,否则我建议在null之前使用空字符串。我宁愿只将null用作"未定义"。例如,在用户输入的情况下,如果用户输入该字段且未键入任何内容,则该字符串将为空。但是,如果用户只是跳过该字段,则该字段可能为null。

在定义null的含义之前,我倾向于返回一个空字符串并在处理端使用String.IsNUllOrEmpty,因为代替任何将来的知识,我应该假定null和empty相同。

但是Web服务有一个特殊的转折,即在<element /> 、、 <element> </ element>中的差异与根本就缺失的元素之间存在着很多错误的工具。令人困惑的是,除非我控制整个事情,否则我不相信互操作性是可以接受的。

因此,如果我有一个需要表示的像null这样的概念,我将创建一个单独的布尔元素来表示存在/不存在。

我个人更喜欢返回null而不是空字符串。
如果数据库具有空值,则理想情况下,返回该值的Web服务应返回空值而不是空字符串。

话虽如此,我遇到了这样的问题:像Adobe Flex这样的Web服务客户端不能真正使用null,如果无法修改客户端,则可能必须传递一个空字符串。

无论哪种方式,我都看不到任何安全问题。