note 86521 modified in book.soap by danbrown

From: Date: Wed, 22 Oct 2008 22:54:37 +0000
Subject: note 86521 modified in book.soap by danbrown
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-145624@lists.php.net to get a copy of this message
If you've been trying to send null to a service that considers empty property tags as empty strings rather than null, here's an extending class that fixes this using xsi:nil: <?php class XSoapClient extends SoapClient { const XSI_NS = "http://www.w3.org/2001/XMLSchema-instance"; const _NULL_ = "xxx_replacedduetobrokephpsoapclient_xxx"; protected $mustParseNulls = false; public function __doRequest($request, $location, $action, $version, $one_way = null) { if($this->mustParseNulls) { $this->mustParseNulls = false; $request = preg_replace('/<ns1:(\w+)>'.self::_NULL_.'<\/ns1:\\1>/', '<ns1:$1 xsi:nil="true"/>', $request, -1, &$count); if ($count > 0) { $request = preg_replace('/(<SOAP-ENV:Envelope )/', '\\1 xmlns:xsi="'.self::XSI_NS.'" ', $request); } } return parent::__doRequest($request, $location, $action, $version, $one_way); } public function __call($method, $params) { foreach($params as $k => $v) { if($v === null) { $this->mustParseNulls = true; $params[$k] = self::_NULL_; } } return parent::__call($method, $params); } } ?> --was-- My code below doesn't allow for any empty strings, so it's wrong, here's a better solution: class XSoapClient extends SoapClient { const XSI_NS = "http://www.w3.org/2001/XMLSchema-instance"; const _NULL_ = "xxx_replacedduetobrokephpsoapclient_xxx"; protected $mustParseNulls = false; public function __doRequest($request, $location, $action, $version, $one_way = null) { if($this->mustParseNulls) { $this->mustParseNulls = false; $request = preg_replace('/<ns1:(\w+)>'.self::_NULL_.'<\/ns1:\\1>/', '<ns1:$1 xsi:nil="true"/>', $request, -1, &$count); if ($count > 0) { $request = preg_replace('/(<SOAP-ENV:Envelope )/', '\\1 xmlns:xsi="'.self::XSI_NS.'" ', $request); } } return parent::__doRequest($request, $location, $action, $version, $one_way); } public function __call($method, $params) { foreach($params as $k => $v) { if($v === null) { $this->mustParseNulls = true; $params[$k] = self::_NULL_; } } return parent::__call($method, $params); } } http://php.net/manual/en/book.soap.php

« previous php.notes (#145624) next »