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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach langen Stunden des Experimentierens habe ich die Lösung gefunden!
So dass wieder eine Struktur, die die drei Mitglieder - ein int responseCode, ein string, responseMessage, und ein array von structs aufgerufen stuffArray in der Beispiel - über SOAP mit NuSOAP (PHP) sieht aus wie das unten, habe ich einige Kommentare in den code, um es eindeutig:
Geben Sie dieser Datei einen Namen, zum Beispiel
getStuffComplex.php
, und dann kopieren Sie diese Datei irgendwo auf Ihrem webserver, und erinnere mich an den Weg.Zum Beispiel ein domain-name auf meinem lokalen webserver ist
http://soap.local
und die oben erwähnten PHP-code erreicht werden kannhttp://soap.local/getStuffComplex.php
.Lassen Sie uns sagen, Sie wollen nennen getStuffs () - Funktion in einer C# - code über einen SOAP-client aus einer Konsole-Anwendung unter Visual Studio 2010. In diesem Fall müssen Sie die folgenden Schritte aus:
http://soap.local/getStuffComplex.php?wsdl
C# - code:
Die Ausgabe:
Ich hoffe, dies hilft jemand, der kämpfte mit bringen PHP und SOAP und .NET zusammen.
(Hinweis: achten Sie darauf, über die Zeichen-Codierung bei der Verwendung von Akzenten oder einem besonderen Buchstaben. Standardmäßig ANSI verwendet werden könnten (aber Zeichenkodierungen müssen identisch sein).)