PHP SoapClient создает ссылки XML для идентичных элементов, делает его неприемлемым для обслуживания - PullRequest
5 голосов
/ 17 марта 2012

Я работаю над SOAP-клиентом в PHP, и вызовы проходят через службу нормально, за исключением вызовов, в которых есть элементы, которые идентичны друг другу.Кажется, что когда это происходит, вместо создания двух отдельных, но идентичных элементов, таких как:

<ns1:someelement>
  <ns1:name>name1</ns1:name>
  <ns1:value>value1</ns1:value>
</ns1:someelement>
<ns1:someelement>
  <ns1:name>name1</ns1:name>
  <ns1:value>value1</ns1:value>
</ns1:someelement>

, он настаивает на том, чтобы сделать только одну копию элемента и присвоить ему идентификатор, и использовать href для любогопоследующие экземпляры этого элемента (показанного ниже), который не поддерживается веб-сервисом, которым я пользуюсь (я не знаю, почему это так, но это не имеет значения, потому что я не могу его изменить)

<ns1:someelement id="#ref1">
  <ns1:name>name1</ns1:name>
  <ns1:value>value1</ns1:value>
</ns1:someelement>
<ns1:someelement href="#ref1" />

Таким образом, мой вопрос заключается в том, как я могу заставить XML выдавать дубликаты, включенные полностью, а не их, используя hrefs / ids.Я проверил документы для PHP SoapClient для опции или чего-то в этом роде, но не смог ничего найти.Любая помощь или совет будет принята с благодарностью.Спасибо.

Ответы [ 4 ]

3 голосов
/ 20 марта 2015

SoapClient делает ссылку только тогда, когда вы используете один и тот же объект на нескольких узлах XML.Сделайте для каждого места новый объект, если вам не нужны ссылки.

0 голосов
/ 24 октября 2014

В вашем PHP-коде создайте свойство с уникальным индексом, чтобы результирующий XML-код выглядел следующим образом:

<ns1:someelement>
  <ns1:name>name1</ns1:name>
  <ns1:value>value1</ns1:value>
  <ns1:index>0</ns1:value>
</ns1:someelement>
<ns1:someelement>
  <ns1:name>name1</ns1:name>
  <ns1:value>value1</ns1:value>
  <ns1:index>1</ns1:value>
</ns1:someelement>

Тогда PHP SoapClient не будет делать ссылки href на те же копии данных, и веб-служба успешно игнорирует этиуникальные поля в моем случае.Нет, я не передаю те же поля элемента, что и ссылка в коде PHP.Они клонированы, однако PHP SoapClient достаточно умен, чтобы, к сожалению, заархивировать их множественные вхождения в качестве ссылок.

0 голосов
/ 17 марта 2015

Здравствуйте. Вы можете попробовать это исправить:

Вам необходимо расширить SoapClient и исправить сгенерированный запрос:

Вам необходимо добавить теги, которые вызывают проблемы здесь

$tags = ['Tag1', 'Tag2', 'Tag3'];

А затем используйте MySoapClient вместо SoapClient

class MySoapClient extends SoapClient {

public function __construct($a, $b){
    parent::__construct($a, $b);
}

public function __doRequest($request, $location, $action, $version, $one_way = 0) {

    $tags = ['Tag1', 'Tag2', 'Tag3'];
    foreach($tags as $tag){
        if (preg_match("~<ns1:{$tag} id=\"ref(.+)\">(.+)</ns1:{$tag}>~ismU", $request, $matches)) {
            $ref = $matches[1];

            $request = str_replace([' id="ref'.$ref.'"'], '', $request);

            $tagValue = "<ns1:{$tag}>{$matches[2]}</ns1:{$tag}>";
            $request = str_replace("<ns1:{$tag} href=\"#ref{$ref}\"/>", $tagValue, $request);
        }
    }
    return parent::__doRequest($request, $location, $action, $version);
}

}

0 голосов
/ 24 октября 2012
  • Убедитесь, что не используете ссылки
  • Попробуйте добавить параметры вручную с помощью SoapParam
  • Попробуйте добавить параметры вручную с помощью SoapVar

$soapClient->__soapCall('Method', array(
    new SoapParam($someelement1, 'someelement'),
    // or
    new SoapVar('<ns1:someelement><ns1:name>name1</ns1:name><ns1:value>value1</ns1:value></ns1:someelement>', XSD_ANYXML)
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...