2012-02-09 4 views
2

Я пишу PHP-клиент для веб-службы C#/WCF. Параметры для некоторых вызовов состоят из экземпляров бизнес-классов, которые я создаю в PHP, и передаю через HTTP-POST в SOAP-форматированные данные в веб-службу. Конструкторы для некоторых из этих классов имеют один или несколько необязательных параметров, некоторые из которых имеют тип Int32.Нулевые значения в PHP SoapClient вызывает

Когда я устанавливаю эти параметры как необязательные в PHP, а затем отправляю экземпляры до веб-службы, они передаются как пустые строки (ну, точнее, как пустые узлы: <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# не может deserilize его, говоря The value '' cannot be parsed as the type 'Int32'.

Если значение по умолчанию равно 0, то все работает нормально (как и следовало ожидать, учитывая сообщение об ошибке). Проблема в том, что веб-служба имеет бизнес-логику, чтобы по умолчанию использовать эти значения, если они не предоставляются, и я не хочу воспроизводить эту логику в моем клиенте.

Есть ли способ проинструктировать SoapClient от PHP не отправлять нулевые свойства вообще, если они не установлены, вместо отправки пустого узла?

ответ

2

После более тщательного анализа я решил, что эта проблема была в определении WSDL для службы - некоторые свойства бизнес-логики необязательно были отмечены как nillable в WSDL, и в этом случае SoapClient (совершенно правильно) передает пустой узел.

Когда WSDL правильно определяет свойство как николь, когда это свойство имеет значение null, узел помечен как nil="true" и не отображается как пустая строка в конечной точке.