Zend_ベースSoapのwebserviceとその多言語通信(java)(一)
24205 ワード
ZFマニュアルのZendについて見てみましたSoapの説明では、めまいがして、何が起こっているのか、個人的な理解に問題があるのかどうかはわかりませんが、どうも手を出したことがないので、どんなに多くのドキュメントを見ても役に立たないような気がします.そこで、複雑なオブジェクトの転送に関する例を作りました.簡単に文字をスキップするものには基本的に実用的ではありません.
複雑なオブジェクトの転送については,ここでは決して配列だけでなくカスタムオブジェクト(stdclass)を指すが,php配列が複雑なデータ構造の問題を解決するためにカスタムオブジェクトを用いるのはこれ以上ではないと言われているが,原則的にはそうであるが,多言語通信に関わると問題が露呈するので,これを先に置いておく.この実例を話してから話します.
Zend_Soapのカスタムオブジェクトのポイントはannotationで、annotationはjavaで使われていることが多く、phpでそう呼ばれているかどうかはわかりませんが、パラメータタイプの説明であることがよくわかります.例を見てみましょう.
<?php
class Role{
/**
* @return string
*/
public function getDesc() {
return $this->desc;
}
/**
* @return string
*/
public function getParentid() {
return $this->parentid;
}
/**
* @return string
*/
public function getRoleid() {
return $this->roleid;
}
/**
* @return string
*/
public function getRolename() {
return $this->rolename;
}
/**
* @param string $desc
*/
public function setDesc($desc) {
$this->desc = $desc;
}
/**
* @param string $parentid
*/
public function setParentid($parentid) {
$this->parentid = $parentid;
}
/**
* @param string $roleid
*/
public function setRoleid($roleid) {
$this->roleid = $roleid;
}
/**
* @param string $rolename
*/
public function setRolename($rolename) {
$this->rolename = $rolename;
}
/**
* @var string
*/
public $roleid;
/**
* @var string
*/
public $rolename;
/**
* @var string
*/
public $parentid;
/**
* @var string
*/
public $desc;
}
ここではRoleオブジェクトを定義し、各メンバー変数を明記するタイプを用いるが、このannotaionは省略できないことに注意する.
複合データ構造の定義を次に示します.
require_once 'Priority.php';
class RolePriority{
/**
* @return Priority[]
*/
public function getPrioritys() {
return $this->prioritys;
}
/**
* @return string
*/
public function getRoleid() {
return $this->roleid;
}
/**
* @return string
*/
public function getRolename() {
return $this->rolename;
}
/**
* @param Priority[] $prioritys
*/
public function setPrioritys($prioritys) {
$this->prioritys = $prioritys;
}
/**
* @param string $roleid
*/
public function setRoleid($roleid) {
$this->roleid = $roleid;
}
/**
* @param string $rolename
*/
public function setRolename($rolename) {
$this->rolename = $rolename;
}
/**
* @var string
*/
public $rolename;
/**
* @var string
*/
public $roleid;
/**
* @var Priority[]
*/
public $prioritys;
}
このように,需要に応じて1つのウェブサービスが多くのデータ構造を設計する可能性があるが,ここでは省略し,やり方は大同小異である.
これらのオブジェクトを定義した後、ウェブサービスのインタフェースファイル、つまりこのウェブサービスが何をするかを定義します.ここではGatewayというファイルを定義します.もちろんZFの命名規則に基づいて、これは接頭辞を付けます.具体的には、zfドキュメントを参照してください.ここでは詳しく説明しません.
require_once 'CommonMsg.php';
require_once 'MsgResp.php';
require_once 'User.php';
require_once 'UserPriority.php';
require_once 'Userole.php';
require_once 'RolePriority.php';
require_once 'Role.php';
require_once 'Priority.php';
class Custom_Soap_Gateway{
/**
* @param string
* @param string
* @param string
* @return MsgResp
*/
public function logonUser($username, $password,$key)
{
$msgResp =new MsgResp();
$user =new User();
if($username&&$password&&$key)
{
$user->userid ='1';
$user->sex=' ';
$user->username=' ';
}
$msgResp->user =$user;
$msgResp->code='0000';
$msgResp->msg='login successfully';
return $msgResp;
}
/**
* @param string
* @param string
* @return MsgResp
*/
public function logoutUser($username,$key)
{
$msgResp =new MsgResp();
$user =new User();
if($username&&$key)
{
$user->userid ='1';
$user->sex=' ';
$user->username=' ';
}
$msgResp->user =$user;
$msgResp->code='0000';
$msgResp->msg='logout successfully';
return $msgResp;
}
/**
* @param string
* @param string
* @return Userole
*/
public function getUserRole($username,$key)
{
$userole =new Userole();
for($i=0;$i<10;$i++)
{
$role =new Role();
$role->roleid =$i;
$role->parentid='-1';
$role->rolename="role_$i";
$role->desc='xixi';
$userole->roles[$i]=$role;
}
$userole->userid='1';
$userole->username=' ';
return $userole;
}
/**
* @param array
* @param string
* @return MsgResp
*/
public function modifyUser($userinfo,$key)
{
$msgResp =new MsgResp();
$user =new User();
if($userinfo&&$key)
{
$user->userid =$userinfo[0];
$user->sex =$userinfo[1];
$user->username =$userinfo[2];
}
$msgResp->user =$user;
$msgResp->code='0000';
$msgResp->msg='modify successfully';
return $msgResp;
}
/**
* @param string
* @param string
* @return UserPriority
*/
public function getUserPriority($username,$key)
{
$userPriority =new UserPriority();
if($username&&$key)
{
for($i=0;$i<10;$i++)
{
$priority =new Priority();
$priority->prid=$i;
$priority->operation="opti_$i";
$userPriority->prioritys[$i]=$priority;
}
$userPriority->userid='1';
$userPriority->username=' ';
}
return $userPriority;
}
}
ここでは直接処理ファイルをあげて、戻り値は死んでしまいましたが、やり方は同じで、定義されたいくつかの方法はインタラクティブインタフェースに露出します.
Actionでの呼び出し処理は、ここでは動的でない書き方を直接書きました
<?php
/**
*
* @author Administrator
*
*/
class admin_SoapController extends Zend_Controller_Action {
private $_WSDL_URI="http://localhost/ZFDEMO/admin/soap/index?wsdl";
public function preDispatch() {
}
public function indexAction() {
if (isset ( $_GET ['wsdl'] )) {
//return the WSDL
$this->hadleWSDL();
} else {
//handle SOAP request
$this->handleSOAP ();
}
}
public function clientAction()
{
error_reporting( E_ALL | E_STRICT );
try {
$client = new Zend_Soap_Client('http://localhost/ZFDEMO/admin/soap/index?wsdl');
$rs_logout = $client->logoutUser(' ','123456');
$rs_logon =$client->logonUser(' ','123456','key');
$rs_userole =$client->getUserRole(' ','123456');
$rs_priority =$client->getUserPriority(' ','123456');
$userinfo =array(
'0'=>'1',
'1'=>' ',
'2'=>' '
);
$rs_moduser =$client->modifyUser($userinfo,'11111');
Zend_Debug::dump($rs_logout,'logout user info',true);
Zend_Debug::dump($rs_moduser,'modify user info',true);
Zend_Debug::dump($rs_logon,'logon user info',true);
Zend_Debug::dump($rs_userole,'userole info',true);
Zend_Debug::dump($rs_priority,'user property info',true);
} catch (SoapFault $s) {
echo $s->faultstring;
die('ERROR: [' . $s->faultcode . '] ' . $s->faultstring);
} catch (Exception $e) {
echo $e->getMessage();
die('ERROR: ' . $e->getMessage());
}
}
private function hadleWSDL() {
$autodiscover = new Zend_Soap_AutoDiscover ('Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex');
$autodiscover->setUri('http://localhost/ZFDEMO/admin/soap/index');
$autodiscover->setClass ('Custom_Soap_Gateway');
$autodiscover->handle ();
}
private function handleSOAP() {
try{
$soap = new Zend_Soap_Server( $this->_WSDL_URI );
$soap->setClass('Custom_Soap_Gateway');
$soap->registerFaultException(array('Custom_Soap_SoapException'));
$soap->handle();
}catch(Exception $e)
{
echo $e->getMessage();
}
}
}
に注意http://localhost/ZFDEMO/admin/soap/index?wsdlこのurlは実際にindexActionを指しており、その処理方法はもちろんhadleWSDL()であり、私たちのインタフェースクラスを通じてwsdlのファイルを自動的に生成し、soap_を指す役割を果たしています.サーバ処理($autodiscover->seturi('http://localhost/ZFDEMO/admin/soap/index');),私たちは直接IEにこのURLを入力してwsdlの完全な内容を得ます.
(略)
これでsoapポートがオープンし、通信が可能になります.そしてsoap_Client(clientAction)は呼び出します.
結果は次のとおりです.
["user"] => object(stdClass)#45 (3) {
["userid"] => string(1) "1"
["username"] => string(9) " "
["sex"] => string(3) " "
}
["code"] => string(4) "0000"
["msg"] => string(19) "logout successfully"
}
modify user info object(stdClass)#70 (3) {
["user"] => object(stdClass)#71 (3) {
["userid"] => string(1) "1"
["username"] => string(3) " "
["sex"] => string(9) " "
}
["code"] => string(4) "0000"
["msg"] => string(19) "modify successfully"
}
logon user info object(stdClass)#46 (3) {
["user"] => object(stdClass)#47 (3) {
["userid"] => string(1) "1"
["username"] => string(9) " "
["sex"] => string(3) " "
}
["code"] => string(4) "0000"
["msg"] => string(18) "login successfully"
}
userole info object(stdClass)#48 (3) {
["username"] => string(9) " "
["userid"] => string(1) "1"
["roles"] => array(10) {
[0] => object(stdClass)#49 (4) {
["roleid"] => string(1) "0"
["rolename"] => string(6) "role_0"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
[1] => object(stdClass)#50 (4) {
["roleid"] => string(1) "1"
["rolename"] => string(6) "role_1"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
[2] => object(stdClass)#51 (4) {
["roleid"] => string(1) "2"
["rolename"] => string(6) "role_2"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
[3] => object(stdClass)#52 (4) {
["roleid"] => string(1) "3"
["rolename"] => string(6) "role_3"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
[4] => object(stdClass)#53 (4) {
["roleid"] => string(1) "4"
["rolename"] => string(6) "role_4"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
[5] => object(stdClass)#54 (4) {
["roleid"] => string(1) "5"
["rolename"] => string(6) "role_5"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
[6] => object(stdClass)#55 (4) {
["roleid"] => string(1) "6"
["rolename"] => string(6) "role_6"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
[7] => object(stdClass)#56 (4) {
["roleid"] => string(1) "7"
["rolename"] => string(6) "role_7"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
[8] => object(stdClass)#57 (4) {
["roleid"] => string(1) "8"
["rolename"] => string(6) "role_8"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
[9] => object(stdClass)#58 (4) {
["roleid"] => string(1) "9"
["rolename"] => string(6) "role_9"
["parentid"] => string(2) "-1"
["desc"] => string(4) "xixi"
}
}
}
user property info object(stdClass)#59 (3) {
["username"] => string(9) " "
["userid"] => string(1) "1"
["prioritys"] => array(10) {
[0] => object(stdClass)#60 (6) {
["prid"] => string(1) "0"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_0"
["desc"] => NULL
}
[1] => object(stdClass)#61 (6) {
["prid"] => string(1) "1"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_1"
["desc"] => NULL
}
[2] => object(stdClass)#62 (6) {
["prid"] => string(1) "2"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_2"
["desc"] => NULL
}
[3] => object(stdClass)#63 (6) {
["prid"] => string(1) "3"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_3"
["desc"] => NULL
}
[4] => object(stdClass)#64 (6) {
["prid"] => string(1) "4"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_4"
["desc"] => NULL
}
[5] => object(stdClass)#65 (6) {
["prid"] => string(1) "5"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_5"
["desc"] => NULL
}
[6] => object(stdClass)#66 (6) {
["prid"] => string(1) "6"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_6"
["desc"] => NULL
}
[7] => object(stdClass)#67 (6) {
["prid"] => string(1) "7"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_7"
["desc"] => NULL
}
[8] => object(stdClass)#68 (6) {
["prid"] => string(1) "8"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_8"
["desc"] => NULL
}
[9] => object(stdClass)#69 (6) {
["prid"] => string(1) "9"
["type"] => NULL
["url"] => NULL
["module"] => NULL
["operation"] => string(6) "opti_9"
["desc"] => NULL
}
}
}
phpの呼び出しはこれで終わり、多言語通信に関する記録は次のコンテンツに記録される.