我正在为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如果没有设置它们就不发送空属性,而不是发送空节点?
答案 0 :(得分:2)
经过仔细分析后,我确定此问题出现在服务的WSDL定义中 - 某些业务逻辑可选属性未在WSDL中标记为可为空,并且在这种情况下,SoapClient(完全正确)传递空节点
当WSDL正确地将该属性定义为nillable时,当该属性设置为null时,该节点将标记为nil="true"
,并且不会在端点上显示为空字符串。