43
Consuming Web Services Using PHP 5 Adam Trachtenberg Senior Manager of Platform Evangelism, eBay

ApacheCon 2005

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: ApacheCon 2005

Consuming Web ServicesUsing PHP 5

Adam TrachtenbergSenior Manager of Platform Evangelism, eBay

Page 2: ApacheCon 2005

Plan of Attack

REST

SOAP

Page 3: ApacheCon 2005

Weapons

PHP 5

SimpleXML

Streams

ext/soap

Page 4: ApacheCon 2005

REST

URL + HTTP Verb -> XML Reply

Page 5: ApacheCon 2005

Thai Food near 94306http://api.example.com/yellowpages?zip=94306&query=thai+restaurant

<ResultSet><Result>

<Title>Thai City</Title><Address>3691 El Camino Real</Address><City>Palo Alto</City><State>CA</State><Phone>(650) 493-0643</Phone><BusinessUrl>http://www.thaicity.com/</BusinessUrl>

</Result><Result>

<Title>Thai Garden Restaurant</Title><Address>4329 El Camino Real</Address>…

</Result></ResultSet>

Page 6: ApacheCon 2005

REST (In Theory)

SQL REST

CREATE POST

SELECT GET

UPDATE PUT

DELETE DELETE

Page 7: ApacheCon 2005

REST (In Practice)

SQL REST

CREATE GET

SELECT GET

UPDATE GET

DELETE GET

Page 8: ApacheCon 2005

del.icio.us

• Social bookmarking site

• Save pages for yourself

• Share pages with others

• Provide meta-data via folksonomy

• Easy to insert and query the site

Page 9: ApacheCon 2005

del.icio.us/rss

• RSS feeds for everything

• Prepend rss before path

• http://del.icio.us/popular/ebay

• http://del.icio.us/rss/popular/ebay

Page 10: ApacheCon 2005

<rdf:RDF><channel rdf:about="http://del.icio.us/popular/ebay">...</channel><item rdf:about="http://the-winning-bid.com/">

<title>The-Winning-Bid.com</title><link>http://the-winning-bid.com/</link><dc:creator>minenet</dc:creator><dc:date>2005-10-10T03:40:09Z</dc:date>

</item>

<item rdf:about="http://ebaysupplies.usps.com/"><title>USPS | eBay</title><link>http://ebaysupplies.usps.com/</link><dc:creator>kresston</dc:creator><dc:date>2004-11-17T14:51:34Z</dc:date>

</item>

...</rdf:RDF>

Page 11: ApacheCon 2005

RSS + SimpleXML

$url = 'http://del.icio.us/rss/popular/ebay';

$xml = simplexml_load_file($url);

foreach ($xml->item as $item) {printf("%20.20s : %-30.30s\n",

(string) $item->title, (string) $item->link);}

Page 12: ApacheCon 2005

The-Winning-Bid.com : http://64.34.178.175/results.p USPS | eBay : http://ebaysupplies.usps.com/ GarageSale : http://www.iwascoding.com/Gara:: gumshoo - eBay se : http://www.gumshoo.com/ mapBid - View eBay a : http://www.mapbid.com/ Auction Mapper | Vis : http://www.auctionmapper.com/ ebay api developer d : http://developer.ebay.com/ what is it? : http://www.whatis-it.com/ eBay Developer Chall : http://ebay.promotionexpert.co ebay + google maps : http://www.markovic.com/markoveBay drops charges f : http://www.cbronline.com/articMark Pincus Blog: Sh : http://markpincus.typepad.com/

Popular eBay Pages

Page 13: ApacheCon 2005

RSS + SimpleXML

foreach (simplexml_load_file('http://del.icio.us/rss/popular/ebay')->item as $item) {

printf("%20.20s : %-30.30s\n", (string) $item->title, (string) $item->link);

}

Page 14: ApacheCon 2005

REST + GET

• URL + query string

• Test in Firefox

• Still process XML

Page 15: ApacheCon 2005

flickr

• Social digital photo site

• Save photos for yourself

• Share photos with others

• Provide meta-data via folksonomy

• Easy to insert and query the site

Page 16: ApacheCon 2005

flickr/services/rest

• Multiple REST API calls

• API decoupled from site URL structure

• flickr.com/services/rest/?method=...

Page 17: ApacheCon 2005

flickr + GETRequires developer authentication token

Search flickr

http://www.flickr.com/services/api/flickr.photos.search.html

http://www.flickr.com/services/rest/?method=flickr.photos.search&tags=ebay&api_key=giantlonguglystring

Page 18: ApacheCon 2005

<?xml version="1.0" encoding="utf-8" ?> <rsp stat="ok">

<photos page="1" pages="75" perpage="100" total="7422">

<photo id="71550241" owner="27503448@N00" secret="51fb62fb95" server="35" title="champ1" ispublic="1" isfriend="0" isfamily="0"/>...

</photos></rsp>

Page 19: ApacheCon 2005

$base = 'http://www.flickr.com/services/rest/?';

$qs = array('method' => 'flickr.photos.search',

'api_key' => 'biglonguglystring', 'tags' => 'ebay', );

$url = $base . http_build_query($qs);$out = file_get_contents($url);

GET a Request

Page 20: ApacheCon 2005

$xml = simplexml_load_string($out);foreach ($xml->photos->photo as $photo) { $server = (string) $photo['server']; $id = (string) $photo['id']; $secret = (string) $photo['secret']; $img .= "<img src=\"http://static.flickr.com/

{$server}/{$id}_{$secret}_s.jpg\"/>";}

print $img;

Create a Gallery

Page 21: ApacheCon 2005

flickr/ebay

Page 22: ApacheCon 2005

REST + POST

• URL + POST Data

• Can’t test in Firefox

• POST body can be anything

• Return data is XML

Page 23: ApacheCon 2005

flickr + POST

• Requires developer authentication token

• Requires user authentication token

• Add tags to a photo

• http://www.flickr.com/services/api/flickr.photos.addTags.html

Page 24: ApacheCon 2005

$url = 'http://www.flickr.com/services/rest/?';

$qs = array('method' => 'flickr.photos.addTags','api_key' => 'biglonguglystring','auth_token' => 'anotherbiglonguglystring','tags' => 'hongkong','photo_id' => '50021321'

);

Define POST Data

Page 25: ApacheCon 2005

$api_sig ='would_you_believe_another_long_string?';

ksort($qs);foreach ($qs as $k => $v) {

$api_sig .= $k . $v;}

$qs['api_sig'] = md5($api_sig);

Compute the Signature

Page 26: ApacheCon 2005

POST a Request

$content = http_build_query($qs);$options = array( 'http' => array( 'method' => 'POST', 'content' => $content ));

$context = stream_context_create($options);$out = file_get_contents($url, false, $context);

Page 27: ApacheCon 2005

<?xml version="1.0" encoding="utf-8" ?><rsp stat="ok"></rsp>

Page 28: ApacheCon 2005

SOAP

• Leaky abstraction around XML

• Mapped conversion of native data types to XML Schema types and vice versa

• Independent of HTTP

• API described using WSDL

Page 29: ApacheCon 2005

Use ext/soap

• Bundled with PHP 5

• Enabled by default in PHP 5.1

• Written in C not PHP

• Most compatible with other SOAP servers

• Actively maintained

Page 30: ApacheCon 2005

eBay

• Social marketplace site

• Buy items for yourself

• Sell items to others

• Provide meta-data via attributes

• Easy to insert and query the site

Page 31: ApacheCon 2005

api.ebay.com

• Totally decoupled from eBay

• SOAP interface

• Requires developer and user authentication

• Testing and production environments

Page 32: ApacheCon 2005

Search eBay

// Create and configure session$session = new eBaySession('long_string',

'another_long_string', 'ya_long_string');$session->token = 'one_more_long_string';$session->site = 100; // 100 = Motors;$session->location =

https://api.ebay.com/wsapi;

Page 33: ApacheCon 2005

try {$client = new eBaySOAP($session);$params = array(

'Version' => 435,'Query' => '*','CategoryID' => 6001); // Cars

$results = $client->GetSearchResults($params);

} catch (SOAPFault $f) {}

Baby, You Can Find My Car

Page 34: ApacheCon 2005

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:ebay:apis:eBLBaseComponents">

<SOAP-ENV:Header><ns1:RequesterCredentials>

<ns1:eBayAuthToken>one_more_long_string</ns1:eBayAuthToken><ns1:Credentials>

<ns1:AppId>one_long_string</ns1:AppId><ns1:DevId>another_long_string</ns1:DevId><ns1:AuthCert>ya_long_string</ns1:AuthCert>

</ns1:Credentials></ns1:RequesterCredentials>

</SOAP-ENV:Header><SOAP-ENV:Body>

<ns1:GetSearchResultsRequest><ns1:Version>425</ns1:Version><ns1:Query>*</ns1:Query><ns1:CategoryID>6001</ns1:CategoryID><ns1:TotalOnly>true</ns1:TotalOnly>

</ns1:GetSearchResultsRequest></SOAP-ENV:Body>

</SOAP-ENV:Envelope>

Page 35: ApacheCon 2005

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope

xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body>

<GetSearchResultsResponse xmlns="urn:ebay:apis:eBLBaseComponents"><Timestamp>2005-12-09T02:35:57.881Z</Timestamp><Ack>Success</Ack><Version>437</Version><Build>e437_core_Bundled_2112013_R1</Build><ItemsPerPage>100</ItemsPerPage><PageNumber>1</PageNumber><HasMoreItems>true</HasMoreItems><PaginationResult>

<TotalNumberOfPages>294</TotalNumberOfPages><TotalNumberOfEntries>29335</TotalNumberOfEntries>

</PaginationResult><CategoryArray/>

</GetSearchResultsResponse></soapenv:Body>

</soapenv:Envelope>

Page 36: ApacheCon 2005

$total = number_format($results->PaginationResult

->TotalNumberOfEntries);

print "There are {$total} passenger vehiclesfor sale on eBay Motors";

Page 37: ApacheCon 2005

eBay Motors Google Maps

Page 38: ApacheCon 2005

What I’ve learned

• Web services are closed source software

• Documentation and online support is vital

• Debugging is hard

• SOAP sucks! SOAP rocks!

• SOAP interoperability is an issue

• Authentication is ad-hoc

Page 39: ApacheCon 2005

Tips and Tricks

• You’re not querying a local MySQL database

• Cache your data

• Use debugging methods

• Sniff the wire

• Send requests to your own server

Page 40: ApacheCon 2005

It Only Looks Simple

• Web services == (HTTP && XML) != PHP

• You must grok• HTTP• XML• XML Namespaces (Danger!)• XML Schema• XPath (I <heart> XPath)• SOAP

• The data is layered

Page 41: ApacheCon 2005

What Shape Is Your Data?

• REST

• Angled = <> = XML Database

• FLOWR: /Items/Item[Price < 100]/ItemID

• SOAP

• Square = [] = Relational database

• SQL: SELECT ItemID FROM Items WHERE Items.Price < 100

Page 42: ApacheCon 2005

References

• del.icio.us: http://del.icio.us/help/• RSS, HTML, Javascript, JSON, IE Active

Channel, API (REST + GET)

• flickr: http://www.flickr.com/services/api/• RSS, Atom, REST, XML-RPC, SOAP

• eBay: http://developer.ebay.com• RSS, REST, XML API, SOAP, .NET SDK, Java

SDK

Page 43: ApacheCon 2005

Questions?http://www.trachtenberg.com/talks/apachecon2005