Generierung von WSDL mit NuSOAP - return struct mit verschiedenen Typen (int, string, array of structs)

Ich würde gerne die Abfrage einige Stoffe via SOAP durch die Generierung von WSDL mit NuSOAP.

Ich weiß, es gibt viele Fragen rund um das Thema, aber ich habe nicht Erfolg, zur Anpassung der codes zu meinem speziellen problem.

War ich erfolgreich bei der Generierung von WSDL-code liefert nur ein array von structs (assoziatives array), ABER würde ich eher zum zurückgeben eines Objekts (Struktur) enthält eine integer-variable eine string-variable UND ein array von structs.

So, dies ist der code, der arbeitet für die Rückgabe ein array von structs:

<?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();

?>

In einer C# - Konsolenanwendung, nach dem hinzufügen einer Web-Referenz namens "StuffService" mit "?wsdl" an die URL, wo die PHP-Datei gefunden werden kann, dieser code funktioniert, kann ich perfekt die Abfrage der stuff_array Werte wie diese:

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();
        }
    }
}

Das ist cool, ABER ich möchte zu entwickeln, die diesen code zurück zu geben, ein Objekt wie dieses:

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

Was ist der geeignete NuSOAP-code für diese?

Danke!! 🙂

Ich hoffe, ich konnte verdeutlichen, was ich erreichen möchte: Rückgabe einer struct enthält ein int, ein string und ein array von structs, wissen aber nicht wie Sie schreiben die entsprechenden NuSOAP-code für, die. Auf diese Weise konnte ich zunächst überprüfen Sie die responseCode, und behandeln Sie mit den entsprechenden Fehlermeldungen BZW. die Ausgabe der stuffArray, etc.

InformationsquelleAutor Sk8erPeter | 2011-08-08
Schreibe einen Kommentar