Welcome to Abdul Malik Ikhsan's Blog

Zend Framework : Zend_Soap and JSON – Handling Complex Data

Posted in Tutorial PHP, Zend Framework by samsonasik on February 19, 2011

(Sebelum membaca artikel ini, sebaiknya baca dulu artikel sebelumnya tentang web services – red). Point paling penting dari web services adalah INTEROPERABILITY aplikasi, di mana teknologi yang berbeda dapat saling dikaitkan tanpa terikat bahasa pemrograman. Lalu, data-data yang berhubungan bersifat MASHUP di mana tempat penyimpanan data bisa bersifat outsource. Nah, bagaimana cara mengambil data yang bersifat kompleks ? Seperti array atau object ? Kali ini kita akan membahas tentang pemanggilan kompleks data tersebut dengan Zend Framework (komponen Zend_Soap).

Anggap saja kita mempunyai sebuah kelas yang akan memanggil data kompleks :

class Person
{
   /** @var string[] */
   public $name;
   /** @var string[] */
   public $address;
}

class Model_Soaps
{
     /**
     * @param string
     * @return object|array
     */
     public function getData($caller="json")
     {

        $data = array(
		    array('name'=>'abdul malik ikhsan', 'address'=>'jalan sukabumi 15'),
		    array('name'=>'doni iskandar', 'address'=>'jalan petak umpet'),
		    array('name'=>'banu sucipto', 'address'=>'jalan riau 25')
                );
        if ($caller=="json")
	   return  json_encode($data);
        else
           return $data;

     }

    /**
      * @return Person
     */
     public function getComplex()
     {
        $person = new Person();
        $person->name[] = "abdul malik ikhsan";
        $person->address[] = "jalan sukabumi 15";

        $person->name[] = "doni iskandar";
        $person->address[] = "jalan petak umpet";

        $person->name[] = "banu sucipto";
        $person->address[] = "jalan riau 25";

        return $person;
     }
}

Function getData() mengembalikan nilai array atau object json, sedangkan getComplex() adalah fungsi yang mengembalikan instance dari class Person. Nah, yang kita butuhkan adalah Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence yang kita pakai sebagai strategi yang dilewatkan pada saat instansiasi kelas Zend_Soap_AutoDiscover seperti berikut :

....
  $autodiscover = new Zend_Soap_AutoDiscover('Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence');
....

Nah, anggaplah kita punya 2 function untuk memanggil return data tadi dan menghasilkan json encode.

....
    private $wsdlurl = 'http://service.com?wsdl';
    public function clientAction()
    {
        $client = new Zend_Soap_Client($this->wsdlurl);
        //isi variable...
        $strofclient =  $client->getData("json");
	print_r($strofclient);

	die;
    }

    public function client2Action()
    {
        $client = new Zend_Soap_Client($this->wsdlurl);
        //isi variable...
        $strofclient =  $client->getComplex();

	print_r( json_encode( $strofclient ));

	die;
    }
....

Dan kita akan coba tampilkan hasil responsenya di view :

<script type="text/javascript" src="<?php echo $this->baseUrl(); ?>/js/jquery-1.4.2.js"></script>
<script type="text/javascript">
  $(document).ready(function(){
      $("#testcall").click(function(){
           $.get('<?php echo $this->baseUrl('/index/client'); ?>?'+(new Date()).getTime(), function(data){
              for(var i=0;i<=2;i++){
                    $("#nameoutput_"+i).html( data[i].name );
                    $("#addressoutput_"+i).html( data[i].address );
               }
           },"json");
      });

      $("#testcallobject").click(function(){
           $.get('<?php echo $this->baseUrl('/index/client2'); ?>?'+(new Date()).getTime(), function(data){
              for(var i=0;i<=2;i++){
                    $("#nameoutputobj_"+i).html( data.name.item[i]);
                    $("#addressoutputobj_"+i).html( data.address.item[i]);
               }
           },"json");
      });
  });
</script>
<input type="button" value="testcall simple array" id="testcall" />

<br />
<?php for($i=0;$i<=2;$i++){ ?>
name    <?php echo $i; ?> : <label id="nameoutput_<?php echo $i; ?>"></label> <br />
address <?php echo $i; ?> : <label id="addressoutput_<?php echo $i; ?>"></label> <br />
<?php } ?>

<hr />
<input type="button" value="testcall array object" id="testcallobject" />
<br />

<?php for($i=0;$i<=2;$i++){ ?>
    name    <?php echo $i; ?> : <label id="nameoutputobj_<?php echo $i; ?>"></label> <br />
    address <?php echo $i; ?> : <label id="addressoutputobj_<?php echo $i; ?>"></label> <br />
<?php } ?>

Jika berhasil, maka akan tampil seperti berikut :

Baca juga :
https://samsonasik.wordpress.com/2010/06/16/zend-framework-create-web-services-using-zend-soap/

Referensi :
http://framework.zend.com/manual/en/zend.soap.wsdl.html#zend.soap.wsdl.types.add_complex
http://publib.boulder.ibm.com/infocenter/wsdatap/v3r8m1/index.jsp?topic=/xi50/xmlfirewalldevelopersguide10.htm
http://en.wikipedia.org/wiki/Mashup_(web_application_hybrid)
http://yetanotherprogrammingblog.com/node/12
http://stackoverflow.com/questions/2287282/using-of-zend-soap-wsdl-strategy-arrayoftypecomplex-with-string

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: