6CS028 Workshop - Web Services

From mi-linux
Revision as of 15:02, 28 July 2009 by In9352 (talk | contribs)
Jump to navigationJump to search

Main Page >> Web Application Development >> Workbook >> Week 07

There are so many exciting APIs available on the web that it is impossible to cover them all here… so let’s have a look at a known REST example and a known SOAP example:

  • REST - The Amazon API
  • SOAP – The Google Search API

A REST example : Amazon

Note that Amazon is one of the rare providers to still offer both REST and SOAP interfaces to their services… let’s have a look at their REST API.

First, let’s simply select the top selling books on Amazon.com

With REST, it's all about calling the right URL, passing in the right parameters... here is the URL for the top selling books on Amazon.com:

Click me!

If you click on the URL, your browser simply display the XML data (try looking at the page's source code).

So our PHP code looks very much like the code we used to access an RSS feed. Indeed in both cases we are accessing a remote XML file!

<H1>Top Selling Books on Amazon.com at <?= date("d-m-Y H:i"); ?></H1>
<?
 
  // My key is 0NR4EHP6HAVW61V6P1G2
  // APPLY FOR YOUR OWN KEY!!
 
  // Node for books
  $node = 283155;
 
  // Build REST url 
  $url = "http://webservices.amazon.com/onca/xml?";
  $url.= "Service=AWSECommerceService&";
  $url.= "SubscriptionId=0NR4EHP6HAVW61V6P1G2&";
  $url.= "Operation=BrowseNodeLookup&";
  $url.= "BrowseNodeId=$node&";
  $url.= "ResponseGroup=TopSellers";

  // Get raw data
  $response = file_get_contents($url);
  
  // Convert raw data to object
  $xml = simplexml_load_string($response);
 
  // Browse object and display book titles
  foreach($xml->BrowseNodes->BrowseNode->TopSellers->TopSeller as $book)
  {
    echo $book->Title."<br>";
  }

?>

And:

<H1>Top Selling Books on Amazon.com at <?= date("d-m-Y H:i"); ?></H1>
<?
 
  // My key is 0NR4EHP6HAVW61V6P1G2
  // APPLY FOR YOUR OWN KEY!!
 
  // Node for books
  $node = 283155;
 
  // Build REST url 
  $url = "http://webservices.amazon.com/onca/xml?";
  $url.= "Service=AWSECommerceService&";
  $url.= "SubscriptionId=0NR4EHP6HAVW61V6P1G2&";
  $url.= "Operation=BrowseNodeLookup&";
  $url.= "BrowseNodeId=$node&";
  $url.= "ResponseGroup=TopSellers";
         
  // Get raw data
  $response = file_get_contents($url);
  
  // Convert raw data to object
  $xml = simplexml_load_string($response);
 
  // Put a;; asin numbers into a variable
  $ASIN = "";
  foreach($xml->BrowseNodes->BrowseNode->TopSellers->TopSeller as $book)
  {
    $ASIN = $ASIN.$book->ASIN.",";
  }
 
  // Make second call, asking for more details
  
  $url = "http://webservices.amazon.com/onca/xml?";
  $url.= "Service=AWSECommerceService&";
  $url.= "SubscriptionId=0NR4EHP6HAVW61V6P1G2&";
  $url.= "Operation=ItemLookup&";
  $url.= "ItemId=$ASIN&";
  $url.= "ResponseGroup=Medium";
  
  $response = file_get_contents($url);
  $xml = simplexml_load_string($response);
 
  foreach($xml->Items->Item as $bd)
  {
    $ASIN = $bd->ASIN;
    $image = $bd->MediumImage->URL;
    $url = $bd->DetailPageURL;
    $Title =$bd->ItemAttributes->Title;
 
    echo "<IMG src=\"$image\">";
    echo "$Title<BR>";
    
  }
?>

A SOAP example

First, you need to download the NuSOAP library... it's free!

Then:

<?
	require("nusoap/lib/nusoap.php");

  // What we are searching for
  $search = "Alix Bergeret";

  // Create soap client
	$client=new soapclient("http://api.google.com/GoogleSearch.wsdl", true);

  // Set encoding
	$client->soap_defencoding = 'UTF-8';

  // Prepare request
	$request=array(
		'key'=>'4B0KufpQFHJxhAxzua0tR11ElLNrHRJ6',
		'q'=>$search,
		'start'=>0,
		'maxResults'=>5,
		'filter'=>false,
		'restrict'=>'',
		'safeSearch'=>true,
		'lr'=>'',
		'ie'=>'',
		'oe'=>'',
	);

  //  Send request and read response
	$result = $client->call('doGoogleSearch', $request, "urn:GoogleSearch", "urn:GoogleSearch");

  // Loop through array and display
  foreach($result['resultElements'] as $one_result)
  {
    print "<h1>{$one_result['title']}</h1>";
    print "<p>{$one_result['snippet']}</p>";
  }
?>