Me gustaría consultar algunos productos vía SOAP generando WSDL con NuSOAP.
Sé que hay muchas preguntas relacionadas con el tema, pero no tuve éxito para adaptar los códigos a mi problema en particular.Generación de WSDL con NuSOAP - return struct con varios tipos (int, string, array of structs)
Tuve éxito en la generación de código WSDL que devuelve solo una matriz de estructuras (matriz asociativa) PERO Me gustaría devolver un objeto (struct) que contiene una variable entera, una variable de cadena Y una matriz de estructuras.
Así, este es el código que funciona para el retorno de una gran variedad de estructuras:
<?php
function getStuffs($user='', $pass='') {
// here we can check user and pass and do whatever (if it isn't alright, we can throw exception or return NULL or sg. similar)
// .......
$stuff_array = array();
$stuff_array[] = array('id'=>122, 'name'=>'One stuff');
$stuff_array[] = array('id'=>213, 'name'=>'Another stuff');
$stuff_array[] = array('id'=>435, 'name'=>'Whatever stuff');
$stuff_array[] = array('id'=>65, 'name'=>'Cool Stuff');
$stuff_array[] = array('id'=>92, 'name'=>'Wow, what a stuff');
return $stuff_array;
}
require_once 'nusoap/lib/nusoap.php';
$server = new soap_server;
// $myNamespace = $_SERVER['SCRIPT_URI'];
$myNamespace = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
$server->configureWSDL('MyStuffService', 'urn:' . $myNamespace);
// $server->wsdl->schemaTargetNamespace = 'http://soapinterop.org/xsd/';
$server->wsdl->addComplexType(
// name
'Stuffs',
// typeClass (complexType|simpleType|attribute)
'complexType',
// phpType: currently supported are array and struct (php assoc array)
'struct',
// compositor (all|sequence|choice)
'all',
// restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
'',
// elements = array (name = array(name=>'',type=>''))
array(
'id' => array(
'name' => 'id',
'type' => 'xsd:int'
),
'name' => array(
'name' => 'name',
'type' => 'xsd:string'
)
)
);
$server->wsdl->addComplexType(
// name
'StuffsArray',
// typeClass (complexType|simpleType|attribute)
'complexType',
// phpType: currently supported are array and struct (php assoc array)
'array',
// compositor (all|sequence|choice)
'',
// restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
'SOAP-ENC:Array',
// elements = array (name = array(name=>'',type=>''))
array(),
// attrs
array(
array(
'ref' => 'SOAP-ENC:arrayType',
'wsdl:arrayType' => 'tns:Stuffs[]'
)
),
// arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string)
'tns:Stuffs'
);
$server->register(
// string $name the name of the PHP function, class.method or class..method
'getStuffs',
// array $in assoc array of input values: key = param name, value = param type
array(
'user' => 'xsd:string',
'pass' => 'xsd:string'
),
// array $out assoc array of output values: key = param name, value = param type
array(
'return' => 'tns:StuffsArray'
),
// mixed $namespace the element namespace for the method or false
'urn:' . $myNamespace,
// mixed $soapaction the soapaction for the method or false
'urn:' . $myNamespace . "#getStuffs",
// mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically
'rpc',
// mixed $use optional (encoded|literal) or false
'encoded',
// string $documentation optional Description to include in WSDL
'Fetch array of Stuffs ("id", "name").' // documentation
);
#$server->wsdl->schemaTargetNamespace = $myNamespace;
$server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '');
exit();
?>
En una aplicación de consola de C#, después de añadir una referencia Web llamado "StuffService" con el "? Wsdl" anexa a la URL apropiada en este archivo PHP se puede encontrar, este código funciona, puedo consultar a la perfección los valores stuff_array como este:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WebServiceTest
{
class Program
{
static void Main(string[] args)
{
StuffService.MyStuffService myService = new StuffService.MyStuffService();
StuffService.Stuffs[] stuffs = myService.getStuffs("someone", "1234");
foreach (var stuff in stuffs)
{
Console.WriteLine(stuff.id+".: "+stuff.name);
}
Console.WriteLine();
Console.WriteLine("Press a key...");
Console.ReadKey();
}
}
}
Eso está bien, pero me gustaría desarrollar este código para devolver un objeto como éste:
class ResponseObject {
public $responseCode = 0;
public $responseMessage = '';
public $stuffArray = NULL;
}
$responseObject = NULL;
function getStuffs($user='', $pass='') {
global $responseObject;
$responseObject = new ResponseObject();
// check stuffs in a simple way now
if($user != 'someone' && $pass != '1234'){
$responseObject->responseCode = 2;
$responseObject->responseMessage = 'Authentication failed';
return $responseObject;
}
$responseObject->stuffArray = array();
$responseObject->stuffArray[] = array('id'=>122, 'name'=>'One stuff');
$responseObject->stuffArray[] = array('id'=>213, 'name'=>'Another stuff');
$responseObject->stuffArray[] = array('id'=>435, 'name'=>'Whatever stuff');
$responseObject->stuffArray[] = array('id'=>65, 'name'=>'Cool Stuff');
$responseObject->stuffArray[] = array('id'=>92, 'name'=>'Wow, what a stuff');
$responseObject->responseCode = 1;
$responseObject->responseMessage = 'Successful!';
return $responseObject;
}
Cuál es el código NuSOAP apropiada para eso?
Gracias! :)
Espero poder aclarar lo que me gustaría lograr: devolver una estructura que contiene un int, una cadena y una matriz de estructuras, pero no sé cómo escribir el código NuSOAP apropiado para eso. De esta manera, primero pude verificar el código de respuesta y manejarlo con los mensajes de error apropiados O con la salida del archivo stuffArray, etc.