Tipo complejo en PHP NuSoap

Estoy construyendo un servicio web usando la biblioteca NuSoap en PHP. Mi servicio web actuará como una capa intermedia entre el cliente y un servicio web ya existente por un proveedor. Entonces, en lugar de que el cliente se conecte directamente con el proveedor, se conectará a mi servicio web, mi servicio web se conectará con el proveedor y obtendrá la respuesta y enviará la misma respuesta al cliente.

Mi único problema es que mi proveedor está enviando el objeto stdclass (su servicio web está escrito en .Net) y tengo que recibir ese objeto y devolver el mismo objeto al cliente en mi método de servicio web.

He buscado bastante en Internet, pero no hay formas claras de cómo lograr esto mediante la biblioteca NuSoap. Lo que he leído hasta ahora, especifique que tengo que usar el tipo complejo para lograr esto, pero de nuevo no tengo ni idea de cómo obtener la respuesta y luego convertirla al tipo complejo y enviarla al cliente.

Gracias de antemano por tu ayuda.

0

1 Respuestas

Lo que está escribiendo se conoce como proxy .

Hay algunos ejemplos en línea para que el servidor NuSoap envíe tipos complejos a través del Método addComplexType .

//Create a complex type
$server->wsdl->addComplexType('MyComplexType','complexType','struct','all','',
array( 'ID' => array('name' => 'ID','type' => 'xsd:int'),
'YourName' => array('name' => 'YourName','type' => 'xsd:string')));

Un enfoque para implementar el proxy es construir su servicio con datos suprimidos, de modo que primero no se comunique con el servicio de back-end. Vea si puede obtener el cliente original satisfecho con una respuesta artificial de su proxy. Entonces, una vez que tenga eso, consumir el servicio real back-end debe ser trivial (las operaciones del cliente SOAP son más fáciles que las del servidor en mi experiencia).

Otra alternativa es considerar la clase nativa SoapServer . El primer comentario aquí muestra cómo crear un tipo complejo.

EDITAR

Después de mirar un poco más, aquí hay un ejemplo mucho mejor .

Hay 2 formas de registrar un tipo complejo con NuSoap, por docblock en addComplextType (lib/class.wsdl.php)

/**  
* adds an xml Schema complex type to the WSDL types
*
* @param string $name
* @param string $typeClass (complexType|simpleType|attribute)
* @param string $phpType currently supported are array and struct (php assoc array)
* @param string $compositor (all|sequence|choice)
* @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
* @param array $elements e.g. array ( name => array(name=>'',type=>'') )
* @param array $attrs e.g. array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]'))
* @param string $arrayType as namespace:name (xsd:string)
* @see nusoap_xmlschema
* @access public
*/

Vea cómo lo hace en el último ejemplo que publiqué:

$server->wsdl->addComplexType('Contact',
    'complexType',
    'struct',
    'all',
    '',
    array(
            'id' => array('name' => 'id', 'type' => 'xsd:int'),
            'first_name' => array('name' => 'first_name', 'type' => 'xsd:string'),
            'last_name' => array('name' => 'last_name', 'type' => 'xsd:string'),
            'email' => array('name' => 'email', 'type' => 'xsd:string'),
            'phone_number' => array('name' => 'phone_number', 'type' => 'xsd:string')
    )
);

Luego, cómo devolver la respuesta con el tipo complejo Contacto :

function updateContact($in_contact) {
    $contact = new Contact($in_contact['id']);
    $contact->first_name=mysql_real_escape_string($in_contact['first_name']);
    $contact->last_name=mysql_real_escape_string($in_contact['last_name']);
    $contact->email=mysql_real_escape_string($in_contact['email']);
    $contact->phone_number=mysql_real_escape_string($in_contact['phone_number']);
    if ($contact->update()) return true;
}

También puede ver cómo usar la variante de matriz en su ejemplo. Perdón por la gran respuesta!

0
agregado
Gracias por la respuesta, con respecto a los datos truncados, siempre queremos enviar de vuelta la última respuesta del servidor, lo que significa que incluso si la API del proveedor ha cambiado o devuelve un resultado diferente, nuestra API también debería reflejar el mismo tiempo real. Por lo tanto, los datos reprimidos pueden ser difíciles de usar en esta situación. Viniendo al ejemplo de tipo complejo para nusoap, ¿necesito analizar el objeto proveniente del servidor y luego reasignarlo en la matriz para construir un tipo complejo? ¿También puedo construir un tipo complejo dentro de un mét
agregado el autor Ricky, fuente
Ah, podría ser un poco doloroso de implementar, pero te escucho en los datos truncados. Para el tipo complejo, desea registrar el tipo complejo, luego en el método que maneja la solicitud ( updateContact en el segundo ejemplo anterior) el cliente le enviará desea utilizar un soapclient para conectarse al servicio de backend. Analice la respuesta desde allí, cree el objeto o matriz (según la opción struct o array en addComplexType , luego regréselo desde el controlador.
agregado el autor quickshiftin, fuente
PHP - Comunidad española
PHP - Comunidad española
6 de los participantes

En este grupo hablamos de PHP. Partner: es.switch-case.com