Re: [SOAP] PHP SOAP - Extreme newbie questions :/

[email protected] (John Steele) Thu, 01 Apr 2010 18:14:00 -0700
Newsgroups php.soap
Message-ID <[email protected]>
>Hi everyone,
>
>I am an absolute beginner with SOAP :-( :-).
>I have been trying to follow a tutorial
>but I got stuck with "things" not working...  [chopped for brevity]

Hello Lmhelp,

   Your question was probably best asked on the NuSOAP mailing list (CC'd):
[email protected]

   You can find a working NuSOAP/WSDL client/server example at:
http://www.steelesoftconsulting.com/code/stockquote.zip

   This includes a modified nusoap.php with the following changes:
* renamed soapclient to nusoap_client to prevent PHP SOAP extension conflict
* added (object) cast to get_class() calls in serialize_return() [PHP 5.3 
change]

   I'm including the code for stock_server.php (with dummy data) and 
stock_client.php - hopefully the sparse comments will be enough to help you 
understand.  Make sure you don't get any whitespace characters outside the 
<?php and ?> tags.

   This might get a bit munged by some email clients, get the source zip if so.

Hope this helps,
   John
====

<?php /* stock_server.php */

/**
  * NuSOAP Server Example - getStockQuote and hello
  * Demonstrate how to use NuSOAP to create SOAP web services using WSDL.
  * Call this directly from your browser to view the operations & WSDL 
documentation.
  *
  * @author John Steele <[email protected]>
  * @website http://www.steelesoftconsulting.com/
  */

// ini_set('soap.wsdl_cache_enabled', '0');  // disable WSDL cache

   // Pull in the NuSOAP code
require_once 'nusoap.php';
   // Create the server instance
$server = new soap_server();
   // Initialize WSDL support (servicename, namespace)
$server->configureWSDL('stockquote', 'urn:stockquote');

   // Register the method to expose (last 3 optional)
$server->register('getStockQuote',    // method name
   array('symbol' => 'xsd:string'),  // input parameters
   array('return' => 'xsd:decimal'),  // output parameters
   'urn:stockquote',          // namespace
   'urn:stockquote#getStockQuote',    // soapaction
   'rpc',                // style
   'encoded',              // use
   'Return Stock Quote by Symbol'    // documentation
   );

   // Register the method to expose
$server->register('hello',        // method name
     array('name' => 'xsd:string'),    // input parameters
     array('return' => 'xsd:string'),  // output parameters
     'urn:stockquote',          // namespace
     'urn:stockquote#hello',        // soapaction
     'rpc',                // style
     'encoded',              // use
     'Says Hello to the Caller'      // documentation
);

   // Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

/**
  * Returns the Stock Price, or -99.99 if not found
  *
  * @param string $symbol
  * @return float
  */
function getStockQuote($symbol) {
   $stock_price = -99.99;    // flag for not found
     // use some dummy data instead of database for testing
   $row = array('ABC' => 75.00, 'DEF' => 45.00, 'GHI' => 12.00);
   if(isset($row[$symbol])) {
     $stock_price = $row[$symbol];
   }
   return (float) $stock_price;
/*
   // You would *never* really echo anything that isn't XML SOAP
     if(!$retval = mysql_connect('localhost', 'user', 'password')) {
       echo '<p>Database connection error.</p>';
       return -1;
     }
   if(!$retval = mysql_select_db('soap_tutorial')) {
       echo '<p>Unable to select database.</p>';
       return -2;
     }
     $query = "SELECT stock_price FROM stockprices ".
        "WHERE stock_symbol = '" . $symbol . "'";
     if(!$result = mysql_query($query)) {
       echo '<p>Query error in '. $query. '</p>';
       return -3;
     }
     if($row = mysql_fetch_assoc($result)) {
     $stock_price = $row['stock_price'];
   }
   return (float) $stock_price;
*/
}

/**
  * Says Hello to the Caller
  *
  * @param string $name
  * @return string
  */
function hello($name) {
     return 'Hello, '. $name. '.';
}
?>

<?php /* stock_client.php */

/**
  * NuSOAP Client Example - getStockQuote and hello
  * Demonstrate how to use NuSOAP to consume SOAP web services using WSDL.
  *
  * @author John Steele <[email protected]>
  * @website http://www.steelesoftconsulting.com/
  */
   // This certainly will need to be changed to fit your server environment
define('SERVER_URL', 'http://localhost/ws/stockquote/stock_server.php');
   // Set to true for testing/debugging (a LOT of info), false for production
define('TESTING', false);

$symbol = 'ABC';            // Set fictional default, or from URL GET
if(isset($_GET['symbol']) && !empty($_GET['symbol']))  // ?symbol=XYZ
   $symbol = $_GET['symbol'];

require_once 'nusoap.php';        // Pull in the NuSOAP code
if(!TESTING)              // turn off debugging for speed/production
   nusoap_base::setGlobalDebugLevel(0);

   // Create the client instance
$client = new nusoap_client(SERVER_URL. '?wsdl', true);
if($err = $client->getError()) {    // Check for an error
   echo '<h2>Constructor error</h2><pre>'. $err. '</pre>';
}
if(TESTING)
   dump($client->debug_str);

   // This block isn't stock quote related, but a simple example
$params = array('name' => 'Bob');      // Say hello to Bob
$result = $client->call('hello', $params);  // No Error Checking at all!
dump($result);

$params = array('symbol' => $symbol);  // Return Stock Quote by Symbol
   // Call the SOAP method
$result = $client->call('getStockQuote', $params);
if ($client->fault) {          // Check for a fault
     echo '<h2>Client Fault</h2>'. dump($result);
}
else {
   if ($err = $client->getError()) {  // Check for an error
         echo '<h2>Call Error</h2>'. dump($err);
     }
     else {                // Display the result
         // echo '<h2>Result</h2>'. dump($result);
       $result = sprintf('%4.2f', $result);  // format to 2 decimal places
       if($result != -99.99)
       echo '<p>The stock price for "'. $params['symbol'].
          '" is <strong>'. $result. '</strong></p>';
     else
       echo '<p>Stock symbol "'. $params['symbol']. '" not found.';
     }
}

if(TESTING) {
     // Display the request and response
   echo '<h2>Request</h2><pre>'. htmlspecialchars($client->request, 
ENT_QUOTES). '</pre>';
   echo '<h2>Response</h2><pre>'. htmlspecialchars($client->response, 
ENT_QUOTES). '</pre>';
     // Display the debug messages
   echo '<h2>Debug</h2><pre>'. htmlspecialchars($client->debug_str, 
ENT_QUOTES). '</pre>';
     // Display the client object - very handy for server PHP warnings, etc.
   echo '<h2>Client</h2>';
   dump($client);
}

unset($client);              // Kill the instance to free up memory

   // some handy functions
function dump($this) {
   echo '<pre style="font:normal 14px Courier New,Courier,Times New 
Roman,serif">'.
      print_r($this, 1). '</pre>';
   }
function get_xml($xml) {
   return str_replace('><', ">\n<", $xml);
   }
?>


--
/* Steelesoft Consulting     John Steele - Systems Analyst/Programmer
  *  We also walk dogs...  Dynamic Web Design, PHP/MySQL/Linux/Hosting
  *  http://www.steelesoftconsulting.com/  (541) 708-1708
  */