2012-03-16 9 views
5

Estoy trabajando en un cliente SOAP en PHP, y las llamadas están pasando por el servicio fino, con la excepción de llamadas donde hay elementos que son idénticos el uno al otro. Parece que cuando esto sucede, en lugar de crear dos elementos separados pero idénticos, como este:PHP SoapClient creando referencias XML para elementos idénticos, lo hace inaceptable para el servicio

<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> 

se insiste en hacer sólo una copia del elemento y asignándole un ID, y el uso de href para cualquier instancia posteriores de ese elemento (que se muestra a continuación), que no está soportada por el servicio web que estoy usando (no sé por qué esto es, pero en realidad no importa porque no puedo cambiarlo)

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

Así que mi La pregunta es cómo podría obligar al XML a salir con los elementos duplicados incluidos en su totalidad, en lugar de usar hrefs/ids. Revisé los documentos de PHP SoapClient para ver una opción o algo por el estilo, pero no pude encontrar nada. Cualquier ayuda o consejo sería muy apreciado. Gracias.

+0

Ninguno de los clientes de soap de PHP es tan bueno. Es bastante trivial enrollar a mano uno, al menos para un servicio web en particular. Sinceramente, recomiendo ir por esa ruta si los paquetes preempaquetados no funcionan para usted (me he enfrentado a este problema yo mismo más de una vez, el trabajo manual funcionó bien). –

Respuesta

0
  • Asegúrese de no utilizar referencias
  • intenta agregar params manualmente con SoapParam
  • intenta agregar params manualmente con 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) 
)); 
0

En su código PHP hacer que una propiedad con índice único para que el XML resultante se vea como:

<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> 

Luego PHP SoapClient no hará referencias href a las mismas copias de datos y el servicio web ignoró con éxito estos campos únicos en mi caso. No, no paso los mismos campos de algún elemento como referencia en el código PHP. Son clonados, sin embargo, PHP SoapClient es lo suficientemente inteligente como para comprimir sus múltiples occurencies como referencias, desafortunadamente.

0

Hola Usted puede tratar de esta revisión:

Es necesario que se extiende la SoapClient y fijar la solicitud generada:

Es necesario añadir las etiquetas que están causando problemas aquí

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

Y luego use el MySoapClient en lugar de 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); 
} 

}

3

SoapClient hace una referencia solo cuando utiliza el mismo objeto en varios nodos XML. Haga para cada lugar un nuevo objeto si no quiere las referencias.

Cuestiones relacionadas