SlideShare a Scribd company logo
PHP and Web Services:
   Perfect Partners
About Me
●
    Lorna Jane Mitchell
●
    PHP Developer/Trainer/Consultant at Ibuildings
    ●
        Hosting DPC
    ●
        Editor at techPortal

●
    http://lornajane.net
●
    @lornajane
PHP
●
    PHP: "solving the web problem"
●
    The problem evolves
●
    PHP evolves
PHP
●
    Server
●
    Client
●
    Web application tool
●
    Command line tool
●
    GTK ...
PHP
●
    Ubiquitous
●
    Runs on your platform
    ●
        *nix
    ●
        mac
    ●
        windows (yes really, rather well!)

●
    Can talk to your other systems
Web Services
●
    "scalable, reusable libraries"
●
    Interface over HTTP
●
    Modular application design
Architecture
Traditional Architecture
Traditional Architecture
Additional Channels
Services Architecture
Inside The Service Layer
Data Formats
JSON
●
    JavaScript Object Notation
●
    Natively read/write in most languages
●
    Very simple! (we like simple)
●
    Limitations
    ●
        no data typing
    ●
        no distinction between object and array
Writing JSON from PHP
   1   <?php
   2
   3   $menu['starter'] = array( "prawn cocktail",
   4                             "soup of the day");
   5   $menu['main course'] = array( "roast chicken",
   6                                 "fish 'n' chips",
   7                                 "macaroni cheese");
   8   $menu['pudding'] = array( "cheesecake",
   9                             "treacle sponge");
  10
  11   echo json_encode($menu);




{"starter":["prawn cocktail","soup of the day"],"main 
course":["roast chicken","fish 'n' chips","macaroni 
cheese"],"pudding":["cheesecake","treacle sponge"]}
Reading JSON from PHP
    1 <?php
    2
    3 $json = '{"starter":["prawn cocktail","soup of the
day"],"main course":["roast chicken","fish 'n'
chips","macaroni cheese"],"pudding":["cheesecake","treacle
sponge"]}';
    4
    5 print_r(json_decode($json));
Reading JSON from PHP
stdClass Object
(
    [starter] => Array
        (
            [0] => prawn cocktail
            [1] => soup of the day
        )
    [main course] => Array
        (
            [0] => roast chicken
            [1] => fish 'n' chips
            [2] => macaroni cheese
        )
    [pudding] => Array
        (
            [0] => cheesecake
            [1] => treacle sponge
        )
)
XML
●
    eXtensible Markup Language
●
    Familiar
●
    Can give more detail than JSON
●
    Native read/write in most languages
Working with XML from PHP
●
    Lots of options
●
    SimpleXML
●
    DOM
SimpleXML Example
 1   <?php
 2
 3   $xml = <<< XML
 4   <?xml version="1.0" ?>
 5   <menus>
 6        <menu>Lunch</menu>
 7        <menu>Dinner</menu>
 8        <menu>Dessert</menu>
 9        <menu>Drinks</menu>
10   </menus>
11   XML;
12
13   $simplexml = new SimpleXMLElement($xml);
14   var_dump($simplexml);
SimpleXML Example
object(SimpleXMLElement)#1 (1) {
  ["menu"]=>
  array(5) {
    [0]=>
    string(5) "Lunch"
    [1]=>
    string(6) "Dinner"
    [2]=>
    string(7) "Dessert"
    [3]=>
    string(6) "Drinks"
  }
}
SimpleXML Example
    1 <?php
    2
    3 $simplexml = simplexml_load_string('<?xml version="1.0"
?><menus/>');
    4 $simplexml->addChild('menu','Lunch');
    5 $simplexml->addChild('menu','Dinner');
    6 $simplexml->addChild('menu','Drinks');
    7 $simplexml->addChild('menu','Dessert');
    8
    9 echo $simplexml->asXML();
SimpleXML Example

<?xml version="1.0"?>
<menus>
    <menu>Lunch</menu>
    <menu>Dinner</menu>
    <menu>Dessert</menu>
    <menu>Drinks</menu>
</menus>
Service Types
Service Types
●
    *-RPC
    – XML-RPC

    – JSON-RPC

●
    SOAP
●
    REST
RPC
●
    All URLs point to a single endpoint
●
    Parameters give method names
●
    Request body can take a variety of formats
Example RPC services
●
    Using Flickr's XML-RPC
●
    Test method: just echoes back to user
●
    XML formatted data
Flickr Echo Example: XML
<?xml version="1.0"?>
<methodCall>
  <methodName>flickr.test.echo</methodName>
  <params>
    <param>
      <value>
        <struct>
           <member>
             <name>api_key</name>
             <value>....</value>
           </member>
        </struct>
      </value>
    </param>
  </params>
</methodCall>
RPC from PHP: curl
 1   <?php
 2
 3   // $xml is existing SimpleXMLElement Object
 4   $url = 'http://api.flickr.com/services/xmlrpc/';
 5   $ch = curl_init($url);
 6
 7   curl_setopt($ch, CURLOPT_POST, 1);
 8   curl_setopt($ch, CURLOPT_POSTFIELDS, $xml->asXML());
 9
10   $response = curl_exec($ch);
11   curl_close($ch);
RPC from PHP: pecl_http
 1   <?php
 2
 3   $url = 'http://api.flickr.com/services/xmlrpc/';
 4
 5   // procedural method
 6   $response = http_post_data($url, $xml->asXML());
 7
 8   // alternative method
 9   $request = new HTTPRequest($url, HTTP_METH_POST);
10   $request->setRawPostData($xml->asXML());
11   $request->send();
12   $response = $request->getResponseBody();
13
14   var_dump($response);
Flickr Response
<?xml version="1.0" encoding="utf-8" ?>
<methodResponse>
  <params>
    <param>
      <value>
        <string>&lt;api_key&gt;54rt346&lt;/api_key&gt;
        </string>
      </value>
    </param>
  </params>
</methodResponse>
RPC Advantages
●
    RPC is a great format for wrapping existing
    functionality
●
    Can abstract between existing systems
●
    Familiar functional paradigm
Delivering RPC
●
    Consumers will need
    – Service URL

    – Docs of functions and arguments

    – If this was an existing system, existing docs may
     suffice
Wrapping RPC
●
    RPC is a library-like interface
●
    Can easily wrap existing libraries to call like this
●
    Can wrap an interface to an RPC service to
    look like a library
Wrapping RPC Example
 1   <?php
 2
 3   class Handler
 4   {
 5    function __call($method, $args) {
 6       $ch = curl_init('http://localhost');
 7       $data['method'] = $method;
 8       foreach($args as $a) $data[$a] = $a;
 9
10      curl_setopt($ch, CURLOPT_POST,1);
11      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
12      $response = curl_exec($ch); curl_close($ch);
13
14      var_dump($response);
15    }
16   }
17   $h = new Handler();
18   $h->dance('cat','dog','rabbit','penguin');
19
SOAP
●
    Special case of RPC using XML
●
    Has given formats for messages and errors
●
    Libraries exist for creating server and client in
    most languages
PHP SOAP Server Example

require_once('lib/myClass.php');


$server = new SoapServer("service.wsdl");
$server->setClass("MyClass");
$server->handle();
PHP SOAP Client Example

$wsdl = "Service.wsdl";
$client = new SoapClient($wsdl, $params);


$output = $client->requestShot(
    'http://www.php.net','', 300, 400);
WSDL
●
    Web Service Description Language
●
    Widely used with SOAP
●
    Describes the methods, arguments and data
    types available
●
    IDEs can read this and hint
●
    Validity of requests is checked before they are
    sent
WSDL
<?xml version ='1.0' encoding ='UTF-8' ?>
 <definitions name='MyClass'      targetNamespace='urn:MyClassInventory'     xmlns:tns='urn:MyClassInventory'    xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'   xmlns:xsd='http://www.w3.org/2001/XMLSchema'   xmlns:soapenc='
http://schemas.xmlsoap.org/soap/encoding/'      xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'   xmlns='http://schemas.xmlsoap.org/wsdl/'>
 <message name='getAccountStatusRequest'>
   <part name='accountID' type='xsd:string'/>
 </message>
 <message name='getAccountStatusResponse'>
   <part name='accountID' type='xsd:string'/>
   <part name='counter' type='xsd:float' />
 </message>
 <portType name='MyClassPortType'>
   <operation name='getAccountStatus'>
    <input message='tns:getAccountStatusRequest'/>
    <output message='tns:getAccountStatusResponse'/>
   </operation>
 </portType>
 <binding name='MyClassBinding' type='tns:MyClassPortType'>
   <soap:binding style='rpc'
    transport='http://schemas.xmlsoap.org/soap/http'/>
   <operation name='getAccountStatus'>
    <soap:operation soapAction='urn:xmethods-delayed-quotes#getAccountStatus'/>
    <input>
     <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes'             encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
    </input>
    <output>
     <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes'
      encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
    </output>
   </operation>
 </binding>
 <service name='MyClassService'>
   <port name='MyClassPort' binding='tns:MyClassBinding'>
    <soap:address location='http://rivendell.local:10002/MyClassServiceServer.php'/>
   </port>
 </service>
 </definitions>
Delivering SOAP
●
    In WSDL mode, only the WSDL needs to be
    supplied
●
    Otherwise method names, arguments and
    types will be needed
REST
●
    A series of concepts
●
    Generally uses HTTP (HyperText Transfer
    Protocol)
●
    URLs are resource locations
●
    Verbs tell the service what to do
●
    Status codes indicate what the outcome was
Implementing REST
●
    Standard application architecture
●
    Routing to map requests to internal functionality
●
    Output not always HTML
REST CRUD
Action     HTTP Verb


Retrieve   GET

Create     POST

Update     PUT

Delete     DELETE
REST Examples
●
    GET
    ●
        http://localhost/users
    ●
        http://localhost/users/harry

●
    POST
    ●
        http://localhost/users

●
    PUT
    ●
        http://localhost/users/harry
REST from PHP: GET
1 <?php
2
3 $result = file_get_contents('http://localhost/users');
4 var_dump($result);
REST from PHP: GET
    1 <?php
    2
    3 $ch = curl_init('http://localhost/users');
    4
    5 curl_exec($ch);




●
    Health Warning!
    ●
        curl will echo output
    ●
        use CURLOPT_RETURNTRANSFER to capture it
        instead
REST from PHP: POST
 1   <?php
 2
 3   $ch = curl_init('http://localhost/users');
 4
 5   $data = array ("name" => "Cho Chang",
 6               "house" => "Ravenclaw");
 7
 8   curl_setopt($ch, CURLOPT_POST, 1);
 9   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
10
11   curl_exec($ch);
REST from PHP: PUT
 1   <?php
 2
 3   $ch = curl_init('http://localhost/users/cho');
 4
 5   $data = array ("name" => "Cho Chang",
 6               "house" => "Ravenclaw"
 7               "age" => 15);
 8
 9   curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
10   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
11
12   curl_exec($ch);
13
REST from PHP: DELETE
1   <?php
2
3   $ch = curl_init('http://localhost/users/ginny');
4
5   curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
6
7   curl_exec($ch);
Delivering REST
●
    Full documentation including URL formats, data
    types, and response formats
●
    Must include information about error handling
REST as an inspiration
●
    RESTful is a strict definition
●
    REST is full of great ideas
●
    REST is great for clean, simple, robust services
●
    Cherry-pick the bits that work
    ●
        Just don't call it "RESTful" :)
Resources
●
    RESTful Web Services – Leonard Richardson
    and Sam Ruby
●
    http://php.net
●
    http://benramsey.com
●
    http://lornajane.net
Questions ???
Thankyou
●
    Lorna Jane Mitchell
●
    http://ibuildings.com
●
    http://lornajane.net
●
    @lornajane



●
    http://slideshare.net/lornajane

More Related Content

What's hot (20)

PDF
Psr-7
Marco Perone
 
PDF
Consuming RESTful services in PHP
Zoran Jeremic
 
PDF
Psr 7 symfony-day
Marco Perone
 
ODP
PHP BASIC PRESENTATION
krutitrivedi
 
PPT
Php basic for vit university
Mandakini Kumari
 
PDF
SOAP-based Web Services
Katrien Verbert
 
PDF
New Features in PHP 5.3
Bradley Holt
 
PPT
Advanced Json
guestfd7d7c
 
PDF
RESTful Web Services
Christopher Bartling
 
PPTX
ASP.NET WEB API
Thang Chung
 
PDF
Services web RESTful
goldoraf
 
PPT
Common Gateway Interface
Balu Masulkar
 
PDF
Web Development Course: PHP lecture 4
Gheyath M. Othman
 
PDF
Crud operations using aws dynamo db with flask ap is and boto3
Katy Slemon
 
PDF
Resource-Oriented Web Services
Bradley Holt
 
PDF
Web Development Course: PHP lecture 1
Gheyath M. Othman
 
PDF
Introducere in web
Alex Eftimie
 
PPTX
Read, store and create xml and json
Kim Berg Hansen
 
PDF
Web Development Course: PHP lecture 3
Gheyath M. Othman
 
PDF
When RSS Fails: Web Scraping with HTTP
Matthew Turland
 
Consuming RESTful services in PHP
Zoran Jeremic
 
Psr 7 symfony-day
Marco Perone
 
PHP BASIC PRESENTATION
krutitrivedi
 
Php basic for vit university
Mandakini Kumari
 
SOAP-based Web Services
Katrien Verbert
 
New Features in PHP 5.3
Bradley Holt
 
Advanced Json
guestfd7d7c
 
RESTful Web Services
Christopher Bartling
 
ASP.NET WEB API
Thang Chung
 
Services web RESTful
goldoraf
 
Common Gateway Interface
Balu Masulkar
 
Web Development Course: PHP lecture 4
Gheyath M. Othman
 
Crud operations using aws dynamo db with flask ap is and boto3
Katy Slemon
 
Resource-Oriented Web Services
Bradley Holt
 
Web Development Course: PHP lecture 1
Gheyath M. Othman
 
Introducere in web
Alex Eftimie
 
Read, store and create xml and json
Kim Berg Hansen
 
Web Development Course: PHP lecture 3
Gheyath M. Othman
 
When RSS Fails: Web Scraping with HTTP
Matthew Turland
 

Similar to PHP And Web Services: Perfect Partners (20)

PPTX
Php hacku
Tom Praison Praison
 
PPTX
HackU PHP and Node.js
souridatta
 
PDF
Mojolicious
Marcos Rebelo
 
KEY
Fatc
Wade Arnold
 
PDF
Php summary
Michelle Darling
 
PDF
関西PHP勉強会 php5.4つまみぐい
Hisateru Tanaka
 
PDF
Bootstrat REST APIs with Laravel 5
Elena Kolevska
 
PDF
Facebook的缓存系统
yiditushe
 
PDF
Consuming RESTful Web services in PHP
Zoran Jeremic
 
PPT
PHP and MySQL.ppt
ROGELIOVILLARUBIA
 
PDF
4069180 Caching Performance Lessons From Facebook
guoqing75
 
PDF
Ch ch-changes cake php2
markstory
 
PPTX
Phphacku iitd
Sorabh Jain
 
PPT
Php i basic chapter 3 (syahir chaer's conflicted copy 2013-04-22)
Muhamad Al Imran
 
PPT
Php i basic chapter 3 (afifah rosli's conflicted copy 2013-04-23)
Muhamad Al Imran
 
PPT
Php i basic chapter 3
Muhamad Al Imran
 
PPTX
PHP from soup to nuts Course Deck
rICh morrow
 
PDF
Creating native apps with WordPress
Marko Heijnen
 
PPTX
PHP for hacks
Tom Praison Praison
 
PPTX
Building and Scaling Node.js Applications
Ohad Kravchick
 
HackU PHP and Node.js
souridatta
 
Mojolicious
Marcos Rebelo
 
Php summary
Michelle Darling
 
関西PHP勉強会 php5.4つまみぐい
Hisateru Tanaka
 
Bootstrat REST APIs with Laravel 5
Elena Kolevska
 
Facebook的缓存系统
yiditushe
 
Consuming RESTful Web services in PHP
Zoran Jeremic
 
PHP and MySQL.ppt
ROGELIOVILLARUBIA
 
4069180 Caching Performance Lessons From Facebook
guoqing75
 
Ch ch-changes cake php2
markstory
 
Phphacku iitd
Sorabh Jain
 
Php i basic chapter 3 (syahir chaer's conflicted copy 2013-04-22)
Muhamad Al Imran
 
Php i basic chapter 3 (afifah rosli's conflicted copy 2013-04-23)
Muhamad Al Imran
 
Php i basic chapter 3
Muhamad Al Imran
 
PHP from soup to nuts Course Deck
rICh morrow
 
Creating native apps with WordPress
Marko Heijnen
 
PHP for hacks
Tom Praison Praison
 
Building and Scaling Node.js Applications
Ohad Kravchick
 
Ad

More from Lorna Mitchell (20)

PDF
OAuth: Trust Issues
Lorna Mitchell
 
PDF
Web Services PHP Tutorial
Lorna Mitchell
 
PDF
Best Practice in API Design
Lorna Mitchell
 
PDF
Git, GitHub and Open Source
Lorna Mitchell
 
PDF
Business 101 for Developers: Time and Money
Lorna Mitchell
 
ODP
Things I wish web graduates knew
Lorna Mitchell
 
PDF
Teach a Man To Fish (phpconpl edition)
Lorna Mitchell
 
ODP
Join In With Joind.In
Lorna Mitchell
 
PDF
Tool Up Your LAMP Stack
Lorna Mitchell
 
PDF
Going Freelance
Lorna Mitchell
 
PDF
Understanding Distributed Source Control
Lorna Mitchell
 
PDF
Best Practice in Web Service Design
Lorna Mitchell
 
PDF
Coaching Development Teams: Teach A Man To Fish
Lorna Mitchell
 
PDF
Zend Certification Preparation Tutorial
Lorna Mitchell
 
PDF
Implementing OAuth with PHP
Lorna Mitchell
 
PDF
Web Services Tutorial
Lorna Mitchell
 
PDF
Object Oriented Programming in PHP
Lorna Mitchell
 
PDF
Example Presentation
Lorna Mitchell
 
PDF
Could You Telecommute?
Lorna Mitchell
 
PDF
Design Patterns
Lorna Mitchell
 
OAuth: Trust Issues
Lorna Mitchell
 
Web Services PHP Tutorial
Lorna Mitchell
 
Best Practice in API Design
Lorna Mitchell
 
Git, GitHub and Open Source
Lorna Mitchell
 
Business 101 for Developers: Time and Money
Lorna Mitchell
 
Things I wish web graduates knew
Lorna Mitchell
 
Teach a Man To Fish (phpconpl edition)
Lorna Mitchell
 
Join In With Joind.In
Lorna Mitchell
 
Tool Up Your LAMP Stack
Lorna Mitchell
 
Going Freelance
Lorna Mitchell
 
Understanding Distributed Source Control
Lorna Mitchell
 
Best Practice in Web Service Design
Lorna Mitchell
 
Coaching Development Teams: Teach A Man To Fish
Lorna Mitchell
 
Zend Certification Preparation Tutorial
Lorna Mitchell
 
Implementing OAuth with PHP
Lorna Mitchell
 
Web Services Tutorial
Lorna Mitchell
 
Object Oriented Programming in PHP
Lorna Mitchell
 
Example Presentation
Lorna Mitchell
 
Could You Telecommute?
Lorna Mitchell
 
Design Patterns
Lorna Mitchell
 
Ad

Recently uploaded (20)

PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PPTX
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PPTX
Designing Production-Ready AI Agents
Kunal Rai
 
PDF
Advancing WebDriver BiDi support in WebKit
Igalia
 
PDF
July Patch Tuesday
Ivanti
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
Designing Production-Ready AI Agents
Kunal Rai
 
Advancing WebDriver BiDi support in WebKit
Igalia
 
July Patch Tuesday
Ivanti
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 

PHP And Web Services: Perfect Partners

  • 1. PHP and Web Services: Perfect Partners
  • 2. About Me ● Lorna Jane Mitchell ● PHP Developer/Trainer/Consultant at Ibuildings ● Hosting DPC ● Editor at techPortal ● http://lornajane.net ● @lornajane
  • 3. PHP ● PHP: "solving the web problem" ● The problem evolves ● PHP evolves
  • 4. PHP ● Server ● Client ● Web application tool ● Command line tool ● GTK ...
  • 5. PHP ● Ubiquitous ● Runs on your platform ● *nix ● mac ● windows (yes really, rather well!) ● Can talk to your other systems
  • 6. Web Services ● "scalable, reusable libraries" ● Interface over HTTP ● Modular application design
  • 14. JSON ● JavaScript Object Notation ● Natively read/write in most languages ● Very simple! (we like simple) ● Limitations ● no data typing ● no distinction between object and array
  • 15. Writing JSON from PHP 1 <?php 2 3 $menu['starter'] = array( "prawn cocktail", 4 "soup of the day"); 5 $menu['main course'] = array( "roast chicken", 6 "fish 'n' chips", 7 "macaroni cheese"); 8 $menu['pudding'] = array( "cheesecake", 9 "treacle sponge"); 10 11 echo json_encode($menu); {"starter":["prawn cocktail","soup of the day"],"main  course":["roast chicken","fish 'n' chips","macaroni  cheese"],"pudding":["cheesecake","treacle sponge"]}
  • 16. Reading JSON from PHP 1 <?php 2 3 $json = '{"starter":["prawn cocktail","soup of the day"],"main course":["roast chicken","fish 'n' chips","macaroni cheese"],"pudding":["cheesecake","treacle sponge"]}'; 4 5 print_r(json_decode($json));
  • 17. Reading JSON from PHP stdClass Object ( [starter] => Array ( [0] => prawn cocktail [1] => soup of the day ) [main course] => Array ( [0] => roast chicken [1] => fish 'n' chips [2] => macaroni cheese ) [pudding] => Array ( [0] => cheesecake [1] => treacle sponge ) )
  • 18. XML ● eXtensible Markup Language ● Familiar ● Can give more detail than JSON ● Native read/write in most languages
  • 19. Working with XML from PHP ● Lots of options ● SimpleXML ● DOM
  • 20. SimpleXML Example 1 <?php 2 3 $xml = <<< XML 4 <?xml version="1.0" ?> 5 <menus> 6 <menu>Lunch</menu> 7 <menu>Dinner</menu> 8 <menu>Dessert</menu> 9 <menu>Drinks</menu> 10 </menus> 11 XML; 12 13 $simplexml = new SimpleXMLElement($xml); 14 var_dump($simplexml);
  • 21. SimpleXML Example object(SimpleXMLElement)#1 (1) { ["menu"]=> array(5) { [0]=> string(5) "Lunch" [1]=> string(6) "Dinner" [2]=> string(7) "Dessert" [3]=> string(6) "Drinks" } }
  • 22. SimpleXML Example 1 <?php 2 3 $simplexml = simplexml_load_string('<?xml version="1.0" ?><menus/>'); 4 $simplexml->addChild('menu','Lunch'); 5 $simplexml->addChild('menu','Dinner'); 6 $simplexml->addChild('menu','Drinks'); 7 $simplexml->addChild('menu','Dessert'); 8 9 echo $simplexml->asXML();
  • 23. SimpleXML Example <?xml version="1.0"?> <menus> <menu>Lunch</menu> <menu>Dinner</menu> <menu>Dessert</menu> <menu>Drinks</menu> </menus>
  • 25. Service Types ● *-RPC – XML-RPC – JSON-RPC ● SOAP ● REST
  • 26. RPC ● All URLs point to a single endpoint ● Parameters give method names ● Request body can take a variety of formats
  • 27. Example RPC services ● Using Flickr's XML-RPC ● Test method: just echoes back to user ● XML formatted data
  • 28. Flickr Echo Example: XML <?xml version="1.0"?> <methodCall> <methodName>flickr.test.echo</methodName> <params> <param> <value> <struct> <member> <name>api_key</name> <value>....</value> </member> </struct> </value> </param> </params> </methodCall>
  • 29. RPC from PHP: curl 1 <?php 2 3 // $xml is existing SimpleXMLElement Object 4 $url = 'http://api.flickr.com/services/xmlrpc/'; 5 $ch = curl_init($url); 6 7 curl_setopt($ch, CURLOPT_POST, 1); 8 curl_setopt($ch, CURLOPT_POSTFIELDS, $xml->asXML()); 9 10 $response = curl_exec($ch); 11 curl_close($ch);
  • 30. RPC from PHP: pecl_http 1 <?php 2 3 $url = 'http://api.flickr.com/services/xmlrpc/'; 4 5 // procedural method 6 $response = http_post_data($url, $xml->asXML()); 7 8 // alternative method 9 $request = new HTTPRequest($url, HTTP_METH_POST); 10 $request->setRawPostData($xml->asXML()); 11 $request->send(); 12 $response = $request->getResponseBody(); 13 14 var_dump($response);
  • 31. Flickr Response <?xml version="1.0" encoding="utf-8" ?> <methodResponse> <params> <param> <value> <string>&lt;api_key&gt;54rt346&lt;/api_key&gt; </string> </value> </param> </params> </methodResponse>
  • 32. RPC Advantages ● RPC is a great format for wrapping existing functionality ● Can abstract between existing systems ● Familiar functional paradigm
  • 33. Delivering RPC ● Consumers will need – Service URL – Docs of functions and arguments – If this was an existing system, existing docs may suffice
  • 34. Wrapping RPC ● RPC is a library-like interface ● Can easily wrap existing libraries to call like this ● Can wrap an interface to an RPC service to look like a library
  • 35. Wrapping RPC Example 1 <?php 2 3 class Handler 4 { 5 function __call($method, $args) { 6 $ch = curl_init('http://localhost'); 7 $data['method'] = $method; 8 foreach($args as $a) $data[$a] = $a; 9 10 curl_setopt($ch, CURLOPT_POST,1); 11 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 12 $response = curl_exec($ch); curl_close($ch); 13 14 var_dump($response); 15 } 16 } 17 $h = new Handler(); 18 $h->dance('cat','dog','rabbit','penguin'); 19
  • 36. SOAP ● Special case of RPC using XML ● Has given formats for messages and errors ● Libraries exist for creating server and client in most languages
  • 37. PHP SOAP Server Example require_once('lib/myClass.php'); $server = new SoapServer("service.wsdl"); $server->setClass("MyClass"); $server->handle();
  • 38. PHP SOAP Client Example $wsdl = "Service.wsdl"; $client = new SoapClient($wsdl, $params); $output = $client->requestShot( 'http://www.php.net','', 300, 400);
  • 39. WSDL ● Web Service Description Language ● Widely used with SOAP ● Describes the methods, arguments and data types available ● IDEs can read this and hint ● Validity of requests is checked before they are sent
  • 40. WSDL <?xml version ='1.0' encoding ='UTF-8' ?> <definitions name='MyClass' targetNamespace='urn:MyClassInventory' xmlns:tns='urn:MyClassInventory' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soapenc=' http://schemas.xmlsoap.org/soap/encoding/' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns='http://schemas.xmlsoap.org/wsdl/'> <message name='getAccountStatusRequest'> <part name='accountID' type='xsd:string'/> </message> <message name='getAccountStatusResponse'> <part name='accountID' type='xsd:string'/> <part name='counter' type='xsd:float' /> </message> <portType name='MyClassPortType'> <operation name='getAccountStatus'> <input message='tns:getAccountStatusRequest'/> <output message='tns:getAccountStatusResponse'/> </operation> </portType> <binding name='MyClassBinding' type='tns:MyClassPortType'> <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/> <operation name='getAccountStatus'> <soap:operation soapAction='urn:xmethods-delayed-quotes#getAccountStatus'/> <input> <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </input> <output> <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </output> </operation> </binding> <service name='MyClassService'> <port name='MyClassPort' binding='tns:MyClassBinding'> <soap:address location='http://rivendell.local:10002/MyClassServiceServer.php'/> </port> </service> </definitions>
  • 41. Delivering SOAP ● In WSDL mode, only the WSDL needs to be supplied ● Otherwise method names, arguments and types will be needed
  • 42. REST ● A series of concepts ● Generally uses HTTP (HyperText Transfer Protocol) ● URLs are resource locations ● Verbs tell the service what to do ● Status codes indicate what the outcome was
  • 43. Implementing REST ● Standard application architecture ● Routing to map requests to internal functionality ● Output not always HTML
  • 44. REST CRUD Action HTTP Verb Retrieve GET Create POST Update PUT Delete DELETE
  • 45. REST Examples ● GET ● http://localhost/users ● http://localhost/users/harry ● POST ● http://localhost/users ● PUT ● http://localhost/users/harry
  • 46. REST from PHP: GET 1 <?php 2 3 $result = file_get_contents('http://localhost/users'); 4 var_dump($result);
  • 47. REST from PHP: GET 1 <?php 2 3 $ch = curl_init('http://localhost/users'); 4 5 curl_exec($ch); ● Health Warning! ● curl will echo output ● use CURLOPT_RETURNTRANSFER to capture it instead
  • 48. REST from PHP: POST 1 <?php 2 3 $ch = curl_init('http://localhost/users'); 4 5 $data = array ("name" => "Cho Chang", 6 "house" => "Ravenclaw"); 7 8 curl_setopt($ch, CURLOPT_POST, 1); 9 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 10 11 curl_exec($ch);
  • 49. REST from PHP: PUT 1 <?php 2 3 $ch = curl_init('http://localhost/users/cho'); 4 5 $data = array ("name" => "Cho Chang", 6 "house" => "Ravenclaw" 7 "age" => 15); 8 9 curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT'); 10 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 11 12 curl_exec($ch); 13
  • 50. REST from PHP: DELETE 1 <?php 2 3 $ch = curl_init('http://localhost/users/ginny'); 4 5 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); 6 7 curl_exec($ch);
  • 51. Delivering REST ● Full documentation including URL formats, data types, and response formats ● Must include information about error handling
  • 52. REST as an inspiration ● RESTful is a strict definition ● REST is full of great ideas ● REST is great for clean, simple, robust services ● Cherry-pick the bits that work ● Just don't call it "RESTful" :)
  • 53. Resources ● RESTful Web Services – Leonard Richardson and Sam Ruby ● http://php.net ● http://benramsey.com ● http://lornajane.net
  • 55. Thankyou ● Lorna Jane Mitchell ● http://ibuildings.com ● http://lornajane.net ● @lornajane ● http://slideshare.net/lornajane