REST-esimerkki käyttäen Google Maps -palvelua

Tässä esimerkissä demotaan, kuinka REST-rajapinnan kautta tietoa voidaan hakea ValueFrame-tietokannasta. JavaScript-koodi lukee tiedot REST:in kautta, käyttäen AJAX-kutsua, ja näyttää asiakkaat Google Maps -palvelussa.

Esimerkkikannan asiakkaat kartalla

REST-kutsun palauttamat tiedot

    Ohjelman kulku

    1. Google Maps alustetaan sivun latauduttua.
    2. Sivun latauduttua jQuery AJAX-kutsu kutsuu PHP-koodia, joka suorittaa REST-pyynnön ValueFrame tietokantaa vasten.
    3. PHP-koodi palauttaa tietueet JSON-muodossa.
    4. JavaScript kutsuu Google Maps -palvelun geocoding-rajapintaa, joka muuttaa osoitteet kartan ymmärtämään muotoon.
    5. Osoitteet näytetään "neuloilla" kartassa.
    6. Käyttäjä voi valita minkä kaupungin asiakkaat näytetään oikean yläkulman valinnalla.

    Arkkitehtuuri

    Järjestelmän arkkitehtuuri on seuraavankaltainen.

    arkkitehtuuri

    PHP-koodi

    Ohessa on listattu PHP-koodi, joka suorittaa REST-kutsun. Koodi voidaan suorittaa kutsumalla sitä osoitteessa https://lab.valueframe.com/rest/accountView.php, jolloinka vastaukseksi saadaan REST-kutsun palauttama data JSON-formaatissa.
    /*
     *------------------------------------------------------------------------
     * AN EXAMPLE OF READING DATA FROM VALUEFRAME SYSTEM USING REST-INTERFACE
     * -Uses cURL for sending/receiving the REST-call.
     * -This code is only an example with minimum error checking, if any.
     *
     * Copyright ValueFrame Oy 2013
     * email: lab@valueframe.com
     *------------------------------------------------------------------------
    */
    
    // Name of the REST-resource
    $resource = 'AccountView';
    // Direction where the rest-call is sent
    $urlBase = 'https://psa.valueframe.com/rest/v2/' . $resource;
    // Name of the actual server that will "answer" the rest-call
    $servername = 'valuedesign.valueframe.com';
    // Customer based transfer key
    $transferKey = '1324354657687980';
    
    // Response is to be compressed (ZIPPED)
    $useZip = false;
    
    // Set authentication headers
    $headers = array(
    	"X-VF-REST-USER:". $servername,
    	"X-VF-REST-TIMESTAMP:". time(),
    	"X-VF-REST-HASH:". md5(time() .'/'. $resource .'/'. $transferKey),
    );
    
    // If zip-compression is used, add the following header
    if ($useZip) {
    	$headers[] = "X-VF-REST-ZIP: 1";
    }
    
    // Initialize cURL
    $ch = curl_init();
    
    // cURL settings
    curl_setopt($ch, CURLOPT_URL, $urlBase);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    // If the CA-certificates are not set correctly, the call will fail.
    // This is potential risk and is only to be used in this example
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    // cURL response and error handling
    $content = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    // Error
    if ($status !== 200) {
    	error_log( __FILE__  . ": cURL error, status code :" . $status );
    	exit(-1);
    }
    // If was compressed (ZIPPED)
    if ($useZip) {
    
    	$dateTime = date("F j, Y, G:i:s");
    
    	// Decode JSON data.
    	$resultData = json_decode($content);
    
    	// Make temp file
    	$tmpFileZip = stream_get_meta_data(tmpfile());
    	$tmpFileZip = $tmpFileZip["uri"];
    
    	// Write file contents
    	file_put_contents($tmpFileZip, base64_decode($resultData->data));
    
    	$content = '';
    
    	// Open ZIP file
    	$zip = new \ZipArchive;
    	$res = $zip->open($tmpFileZip);
    
    	if ($res === true) {
    		// Get stream resource from zip content
    		$fp = $zip->getStream("content");
    
            	if (!$fp) {
    			error_log( __FILE__  . ": Error (ZIP): content not found" );
    			exit(-1);
            	}
    
            	while (!feof($fp)) {
    			$content .= fread($fp, 4096);
    		}
    
    		fclose($fp);
    		$zip->close();
    
    		unlink($tmpFileZip);
    	}else{
    		error_log( __FILE__  . ": Error (ZIP): content extraction failed" );
            	exit(-1);
    	}
    }
    
    // Return results
    echo $content;

    JavaScript AJAX-kutsu

    Ohessa esimerkki AJAX-kutsusta, joka vuorostaan kutsuu 'accountView.php:ta' ja odottaa vastaukseksi JSON-formaatissa olevaa dataa. Koko koodi on nähtävillä osoitteessa https://lab.valueframe.com/rest/js/restmap.js.
    /* -- readRest --
     * Read data by performing an asynchronous HTTP (AJAX) request.
     * Calls accountView.php function (resides at the same server).
    */
    function readRest(){
        $.ajax({
    	url:            '/accountView.php',
    	type:           'GET',
    	dataType:       'json',
    	async:          true,
    	success:        function(data){
    				//Parse data
    			},
    	error:  	function(xhr, textStatus, errorThrown)
    			{
    				//Write error status to console and inform the user
    				console.log( url + ' error , text status:' + textStatus + ', error thrown:' + errorThrown);
    				alert('Failed to retrieve data via REST!');
    		        },
            beforeSend: function(xhr){}
        });
    }