PHP SoapClient调用中的空值

时间:2012-02-09 15:18:01

标签: php wcf web-services null soap-client

我正在为C#/ WCF Web服务编写PHP客户端。某些调用的参数包括我在PHP中实例化的业务类实例,并通过SOAP格式的有效负载中的HTTP POST传递给Web服务。其中一些类的构造函数有一个或多个可选参数,其中一些参数类型为Int32。

当我在PHP中将这些参数设置为可选,然后将实例发送到Web服务时,它们将作为空字符串传输(更具体地说,作为空节点:<ns1:order />在下面的示例中)。这种情况发生在以下任一模型中:

class ThingOne {
    /**
     * @var string $name
     */

    /**
     * @var int $order
     */

    __construct($name, $order = null) {
       $this->name = $name;
       $this->order = $order;
    }
}

class ThingOne {
    /**
     * @var string $name
     */

    /**
     * @var int $order
     */

    __construct($name, $order = null) {
        $this->name = $name;
        if(isset($order) {
            $this->order = $order;
        }
    }
}

一旦该对象进入网络服务,C#就无法对其进行消毒,并说The value '' cannot be parsed as the type 'Int32'

如果我将值默认为0,那么一切正常(正如我所料,给出错误消息)。问题是web服务有业务逻辑来默认这些值,如果它们没有提供,我不想在我的客户端重现那个逻辑。

有没有办法指示PHP的SoapClient如果没有设置它们就不发送空属性,而不是发送空节点?

1 个答案:

答案 0 :(得分:2)

经过仔细分析后,我确定此问题出现在服务的WSDL定义中 - 某些业务逻辑可选属性未在WSDL中标记为可为空,并且在这种情况下,SoapClient(完全正确)传递空节点

当WSDL正确地将该属性定义为nillable时,当该属性设置为null时,该节点将标记为nil="true",并且不会在端点上显示为空字符串。