Нулевые значения в вызовах PHP SoapClient - PullRequest
2 голосов
/ 09 февраля 2012

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

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

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

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

1 Ответ

2 голосов
/ 10 февраля 2012

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

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

...