Php Soap xsd nem szűr
Sziasztok!
Csináltam egy Soap tesztet, az a para vele, hogy nem szűri meg az xsd alapján az átvitt objektumokat.
probe.wsdl:probe.xsd:service.php:client.php:A kérés eredménye:Mint látható a 'test' példányváltozó lazán átment. Ez normális viselkedés, vagy én rontottam el valamit?
■ Csináltam egy Soap tesztet, az a para vele, hogy nem szűri meg az xsd alapján az átvitt objektumokat.
probe.wsdl:
<?xml version="1.0" encoding="utf-8" ?>
<definitions
name="probe"
targetNamespace="http://test.omg/probe"
xmlns:tns="http://test.omg/probe"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/"
>
<types>
<xsd:schema>
<xsd:import schemaLocation="probe.xsd" namespace="http://test.omg/probe" />
</xsd:schema>
</types>
<message name="testRequest">
<part name="testUser" type="xsd:User" />
</message>
<message name="testResponse">
<part name="testMessage" type="xsd:Message" />
</message>
<portType name="probePortType">
<operation name="test">
<input message="tns:testRequest"/>
<output message="tns:testResponse"/>
</operation>
</portType>
<binding name="probeBinding" type="tns:probePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="test">
<soap:operation soapAction="http://test.omg/probe/test"/>
<input>
<soap:body namespace="http://test.omg/probe" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body namespace="http://test.omg/probe" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<service name="probeService">
<port name="probePort" binding="probeBinding">
<soap:address location="http://localhost/service/service.php"/>
</port>
</service>
</definitions>
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://test.omg/probe"
>
<xsd:complexType name="User">
<xsd:all>
<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" />
</xsd:all>
</xsd:complexType>
<xsd:complexType name="Message">
<xsd:all>
<xsd:element name="code" type="xsd:integer" minOccurs="1" maxOccurs="1" />
<xsd:element name="content" type="xsd:string" minOccurs="1" maxOccurs="1" />
</xsd:all>
</xsd:complexType>
</xsd:schema>
class Dispatcher
{
protected $controller;
public function __construct($controller)
{
$this->controller=$controller;
}
public function __call($method,$arguments)
{
if (!method_exists($this->controller,$method))
{
throw new SoapFault(404,'Called action '.get_class($this->controller).'.'.$method.' does not exist!');
}
$result=call_user_func_array(array($this->controller,$method),$arguments);
return $result;
}
}
class WebService
{
protected $wsdl;
protected $dispatcher;
protected $server;
public function setController($class)
{
$this->wsdl=$class.'.wsdl';
if (!file_exists($this->wsdl))
{
throw new SoapFault(404,'The '.$class.' wsdl file for service does not exist!');
}
if (!class_exists($class,true))
{
throw new SoapFault(404,'The '.$class.' service does not exist!');
}
$this->dispatcher=new Dispatcher(new $class());
}
public function run()
{
$this->server=new SoapServer($this->wsdl);
$this->server->setObject($this->dispatcher);
$this->server->handle();
}
}
class ServiceBus
{
public function dispatch($controller)
{
$service=new WebService();
$service->setController($controller);
$service->run();
}
}
class User
{
public $name;
public $test;
}
class Message
{
public $code;
public $content;
public $test;
}
class Probe
{
public function test($user)
{
$message=new Message();
$message->code=1;
$message->content=var_export($user,true);
$message->test='valami';
return $message;
}
}
ini_set('soap.wsdl_cache_enabled',0);
$bus=new ServiceBus();
$bus->dispatch('Probe');
ini_set("soap.wsdl_cache_enabled","0");
class User
{
public $name;
public $test;
}
class Message
{
public $code;
public $content;
}
try{
$probe=new SoapClient('probe.wsdl');
$user=new User();
$user->test='valami';
$user->name='Egy kis szöveg.';
$message=$probe->test($user);
var_dump($message);
}
catch(SoapFault $e)
{
var_dump($e);
}
object(stdClass)#3 (3) {
["code"]=>
int(1)
["content"]=>
string(87) "stdClass::__set_state(array(
'name' => 'Egy kis szöveg.',
'test' => 'valami',
))"
["test"]=>
string(6) "valami"
}
PHP SOAP
Köszi
JSON
Hát nekem első sorban amiatt
js:
Gyakorlatilag azt írja le, hogy a login-nál a bejövő ojjektum User osztályú, és email és password példányváltozók értékeit kell, hogy hozza, a kimenő pedig szintén User osztályú, és a name példányváltozót viszi csak vissza. Nyilván így a be és kimenő adatok xml schema típusa eltérő, de az osztályuk azonos. (Egyelőre még nem tudom, hogy ez megvalósítható e complexType restriction-nel, vagy muszáj lesz elnevezésekkel játszani, ezért nem írok konkrét példát.)
Ha ilyen szintű távoli eljáráshívást meg lehet oldani JSON-RPC-vel, akkor szívesen átállok rá, sajnos még nem volt szerencsém megnézni. (A lényeg, hogy js-ben nagyjából sikerült megoldanom, hogy legyenek osztályok, és ugyanolyan példányokat szeretnék használni távoli eljáráshívásra, mint bármilyen oo nyelvben.)
Belenéztem
Microsoft is csinált valami újabb rendszert távoli dolgokra .NET-ben, de sajnos most nem jut eszembe a neve :S