SlideShare a Scribd company logo
Working with
Web Services
Who am I?

•   Lorna Mitchell
•   PHP Specialist
•   Developer, Writer, Consultant, Trainer
•   Personal site at lornajane.net
•   Twitter: @lornajane
•   PHPNW, PHPWomen


                                             2
Working with Web Services

•   Consuming existing services
•   Web services overview
•   Data types
•   Service types
•   Debugging
•   Using services from PHP


                                  3
What are Web Services?

• Machine-friendly applications
• Formatted data instead of a web page




                                         4
Why Do We Care?

• Web services let us exchange data
  – between systems
  – within systems
• Architecture looks like library or
  module boundary
• Sharing information between systems
  cleanly


                                        5
How do Web Services Work?

• Client/Server
• Sound familiar?
• Request and response, just like a web
  application
• Same theories apply




                                          6
When Things Go Wrong

• Errors will appear in response
• We may not expect them
• Apache logs
• Debug output and logging
• Verbose error-checking and logging
  from our app
• Graceful failure

                                       7
Data Formats




               8
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



                                                9
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"]}
                                                           10
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));




                                                             11
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
        )
                                     12
)
XML

•   eXtensible Markup Language
•   Familiar
•   Can give more detail than JSON
•   Native read/write in most languages




                                          13
Working with XML from PHP

• Lots of options
• SimpleXML
• DOM




                            14
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);



                                                 15
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"
  }
}




                                   16
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();




                                                  17
SimpleXML Example
<?xml version="1.0"?>
<menus>
    <menu>Lunch</menu>
    <menu>Dinner</menu>
    <menu>Dessert</menu>
    <menu>Drinks</menu>
</menus>




                           18
Serialised PHP

• Native to PHP
• Useful for values in database
• Can also use to move data between
  PHP applications




                                      19
Serialising Data in 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 serialize($menu);

a:3:{s:7:"starter";a:2:{i:0;s:14:"prawn
cocktail";i:1;s:15:"soup of the day";}s:11:"main
course";a:3:{i:0;s:13:"roast chicken";i:1;s:14:"fish'n'
chips";i:2;s:15:"macaroni cheese";}s:7:"pudding";a:2:
{i:0;s:10:"cheesecake";i:1;s:14:"treacle sponge";}}
                                                           20
Unserialising Data in PHP
    1 <?php
    2
    3 $serialised = 'a:3:{s:7:"starter";a:2:{i:0;s:14:"prawn
cocktail";i:1;s:15:"soup of the day";}s:11:"main
course";a:3:{i:0;s:13:"roast chicken";i:1;s:14:"fish 'n'
chips";i:2;s:15:"macaroni cheese";}s:7:"pudding";a:2:
{i:0;s:10:"cheesecake";i:1;s:14:"treacle sponge";}}';
    4
    5 var_dump(unserialize($serialised));




                                                          21
Unserialising Data in PHP
array(3) {
  ["starter"]=>
  array(2) {
    [0]=>
    string(14) "prawn cocktail"
    [1]=>
    string(15) "soup of the day"
  }
  ["main course"]=>
  array(3) {
    [0]=>
    string(13) "roast chicken"
    [1]=>
    string(14) "fish 'n' chips"
    [2]=>
    string(15) "macaroni cheese"
  }
  ["pudding"]=>
  array(2) {
    [0]=>
    string(10) "cheesecake"
    [1]=>
    string(14) "treacle sponge"
  }                                22
}
Service Types
Service Types

• SOAP
• *-RPC
  – XML-RPC
  – JSON-RPC
• REST




                24
SOAP

•   Just "soap"
•   Defined XML format
•   Also includes definition for error format
•   Wrappers available for most languages
•   Optionally uses a WSDL to describe the
    service
    – Web Service Description Language


                                            25
Example 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>




                                                                                                                                                                                 26
WSDL tips

• Read from end to beginning
  1.Service location and name
  2.Method names and bindings
  3.Details of request/response messages
  4.Variable names and data types used for
    each request/response
  5.Data type definitions
  6.Namespace information

                                             27
PHP SOAP Client Example
  1   <?php
  2
  3   ini_set('soap.wsdl_cache_enabled','0');
  4
  5   require_once('lib/Snapshot.php');
  6
  7   $wsdl = "Service.wsdl";
  8   $client = new SoapClient($wsdl, $params);
  9
 10   $output = $client->requestShot(
 11       'http://www.php.net','', 300, 400);




                                                  28
Troubleshooting SOAP

• Check request
  – $client->getLastRequest()
• Check request headers
  – $client->getLastRequestHeaders()
• Check WSDL
• Data types can be an issue between
  different client/server languages

                                       29
HTTP Debugging Tools

• cURL
  – http://curl.haxx.se/
• Wireshark
  – http://www.wireshark.org/
• Charles
  – http://www.charlesproxy.com/



                                   30
cURL

•   cURL is a command-line tool
•   Simple but powerful
•   Specify HTTP verb
•   Observe full request/response headers
•   Handle cookies




                                       31
cURL Cheat Sheet

•   curl http://localhost
•   -v to show request/response
•   -I to show response headers
•   -X to specify HTTP method
•   -d to add a data field
•   -c to store cookies in a cookiejar
•   -b to use a cookiejar with request

                                         32
Wireshark Examples




                     33
Wireshark Examples




                     34
Wireshark Examples




                     35
Wireshark Examples




                     36
RPC Services

• Remote Procedure Call
• Similar to library
• Call function with arguments




                                 37
Example RPC services

• Using Flickr's XML-RPC
• Test method: just echoes back to user
• XML formatted data




                                      38
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>

                                              39
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);




                                                             40
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);



                                                          41
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>




                                                         42
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




                                          43
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');         44
 19
Troubleshooting RPC

• Break down into smallest steps
• Can you get a response from the
  service?
• Can you log in?
• Is there an error?
• Try to debug the details of the
  request/response

                                    45
REST

• REpresentational State Transfer
• Not a protocol
• More like a philosophy




                                    46
REST Overview

• 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

                                      47
HTTP Status Codes

    Code      Meaning
    200       OK
    302       Found
    301       Moved
    401       Not Authorised
    403       Forbidden
    404       Not Found
    500       Internal Server Error
                                      48
REST CRUD

       Action     HTTP Verb


       Retrieve   GET

       Create     POST

       Update     PUT

       Delete     DELETE



                              49
REST Examples

• GET
  – http://localhost/users
  – http://localhost/users/harry
• POST
  – http://localhost/users
• PUT
  – http://localhost/users/harry
• DELETE
  – http://localhost/users/harry
                                   50
REST from PHP: GET
  1 <?php
  2
  3 $result = file_get_contents('http://localhost/users');
  4 var_dump($result);




                                                        51
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


                                                 52
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);




                                                     53
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);




                                                           54
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




                                                            55
Troubleshooting REST

• Does resource exist?
• Is there a status code?
• What does the response body look
  like?
• Intercept web traffic
• Use command line curl



                                     56
Working with Web Services
Working with Web Services

•   Consuming existing services
•   Web services overview
•   Data types
•   Service types
•   Debugging
•   Using services from PHP


                                  58
Top tips

• If your app can't talk to the service,
  can you get closer to the service?
• If you control both server and client,
  add debug output
• Use proxies to record what happens
• Start with the lowest common
  denominator and work up


                                           59
Questions?
Thankyou!

   Twitter: @lornajane
Website: http://lornajane.net

More Related Content

What's hot (20)

PDF
Introducere in web
Alex Eftimie
 
PPTX
PHP7 Presentation
David Sanchez
 
PDF
RestMQ - HTTP/Redis based Message Queue
Gleicon Moraes
 
PDF
"The little big project. From zero to hero in two weeks with 3 front-end engi...
Fwdays
 
ODP
PHP BASIC PRESENTATION
krutitrivedi
 
PDF
Psr 7 symfony-day
Marco Perone
 
PDF
神に近づくx/net/context (Finding God with x/net/context)
guregu
 
PDF
Using ngx_lua in UPYUN
Cong Zhang
 
PDF
Umleitung: a tiny mochiweb/CouchDB app
Lenz Gschwendtner
 
PDF
Creating And Consuming Web Services In Php 5
Michael Girouard
 
PDF
Roll Your Own API Management Platform with nginx and Lua
Jon Moore
 
KEY
Fatc
Wade Arnold
 
PPT
Oracle database - Get external data via HTTP, FTP and Web Services
Kim Berg Hansen
 
PPT
PHP - PDO Objects
AJINKYA N
 
PDF
Consuming RESTful services in PHP
Zoran Jeremic
 
PDF
PHP, RabbitMQ, and You
Jason Lotito
 
PPTX
A new way to develop with WordPress!
David Sanchez
 
PDF
The state of your own hypertext preprocessor
Alessandro Nadalin
 
PDF
Lua tech talk
Locaweb
 
TXT
Ip lab
Ema Dunphy
 
Introducere in web
Alex Eftimie
 
PHP7 Presentation
David Sanchez
 
RestMQ - HTTP/Redis based Message Queue
Gleicon Moraes
 
"The little big project. From zero to hero in two weeks with 3 front-end engi...
Fwdays
 
PHP BASIC PRESENTATION
krutitrivedi
 
Psr 7 symfony-day
Marco Perone
 
神に近づくx/net/context (Finding God with x/net/context)
guregu
 
Using ngx_lua in UPYUN
Cong Zhang
 
Umleitung: a tiny mochiweb/CouchDB app
Lenz Gschwendtner
 
Creating And Consuming Web Services In Php 5
Michael Girouard
 
Roll Your Own API Management Platform with nginx and Lua
Jon Moore
 
Oracle database - Get external data via HTTP, FTP and Web Services
Kim Berg Hansen
 
PHP - PDO Objects
AJINKYA N
 
Consuming RESTful services in PHP
Zoran Jeremic
 
PHP, RabbitMQ, and You
Jason Lotito
 
A new way to develop with WordPress!
David Sanchez
 
The state of your own hypertext preprocessor
Alessandro Nadalin
 
Lua tech talk
Locaweb
 
Ip lab
Ema Dunphy
 

Similar to Working with web_services (20)

ODP
Working with Web Services
Lorna Mitchell
 
PDF
Web Services PHP Tutorial
Lorna Mitchell
 
PDF
Php and-web-services-24402
PrinceGuru MS
 
PDF
Web Services Tutorial
Lorna Mitchell
 
PDF
Zendcon 2007 Api Design
unodelostrece
 
PDF
Php And Web Services
thinkphp
 
PDF
PHP and Web Services
Bruno Pedro
 
PDF
Ws rest
patriknw
 
PPTX
Day03 api
ABDEL RAHMAN KARIM
 
PPTX
Day01 api
ABDEL RAHMAN KARIM
 
PDF
Taking Care of The REST - Creating your own RESTful API Server using Restler 2.0
Arul Kumaran
 
PDF
ApacheCon 2005
Adam Trachtenberg
 
KEY
Can't Miss Features of PHP 5.3 and 5.4
Jeff Carouth
 
PPT
Webservices
Nyros Technologies
 
KEY
Future of PHP
Richard McIntyre
 
PDF
Services Drupalcamp Stockholm 2009
hugowetterberg
 
PDF
Brian.suda.thesis
Aravindharamanan S
 
PPT
Web servicesoverview
Prabhat gangwar
 
PDF
Web Service and Mobile Integrated Day I
Anuchit Chalothorn
 
PPT
Wsdl
ppts123456
 
Working with Web Services
Lorna Mitchell
 
Web Services PHP Tutorial
Lorna Mitchell
 
Php and-web-services-24402
PrinceGuru MS
 
Web Services Tutorial
Lorna Mitchell
 
Zendcon 2007 Api Design
unodelostrece
 
Php And Web Services
thinkphp
 
PHP and Web Services
Bruno Pedro
 
Ws rest
patriknw
 
Taking Care of The REST - Creating your own RESTful API Server using Restler 2.0
Arul Kumaran
 
ApacheCon 2005
Adam Trachtenberg
 
Can't Miss Features of PHP 5.3 and 5.4
Jeff Carouth
 
Webservices
Nyros Technologies
 
Future of PHP
Richard McIntyre
 
Services Drupalcamp Stockholm 2009
hugowetterberg
 
Brian.suda.thesis
Aravindharamanan S
 
Web servicesoverview
Prabhat gangwar
 
Web Service and Mobile Integrated Day I
Anuchit Chalothorn
 
Ad

More from Lorna Mitchell (20)

PDF
OAuth: Trust Issues
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
Object Oriented Programming in PHP
Lorna Mitchell
 
PDF
Example Presentation
Lorna Mitchell
 
PDF
Could You Telecommute?
Lorna Mitchell
 
PDF
Design Patterns
Lorna Mitchell
 
PDF
Running a Project with Github
Lorna Mitchell
 
PDF
27 Ways To Be A Better Developer
Lorna Mitchell
 
OAuth: Trust Issues
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
 
Object Oriented Programming in PHP
Lorna Mitchell
 
Example Presentation
Lorna Mitchell
 
Could You Telecommute?
Lorna Mitchell
 
Design Patterns
Lorna Mitchell
 
Running a Project with Github
Lorna Mitchell
 
27 Ways To Be A Better Developer
Lorna Mitchell
 
Ad

Working with web_services

  • 2. Who am I? • Lorna Mitchell • PHP Specialist • Developer, Writer, Consultant, Trainer • Personal site at lornajane.net • Twitter: @lornajane • PHPNW, PHPWomen 2
  • 3. Working with Web Services • Consuming existing services • Web services overview • Data types • Service types • Debugging • Using services from PHP 3
  • 4. What are Web Services? • Machine-friendly applications • Formatted data instead of a web page 4
  • 5. Why Do We Care? • Web services let us exchange data – between systems – within systems • Architecture looks like library or module boundary • Sharing information between systems cleanly 5
  • 6. How do Web Services Work? • Client/Server • Sound familiar? • Request and response, just like a web application • Same theories apply 6
  • 7. When Things Go Wrong • Errors will appear in response • We may not expect them • Apache logs • Debug output and logging • Verbose error-checking and logging from our app • Graceful failure 7
  • 9. 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 9
  • 10. 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"]} 10
  • 11. 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)); 11
  • 12. 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 ) 12 )
  • 13. XML • eXtensible Markup Language • Familiar • Can give more detail than JSON • Native read/write in most languages 13
  • 14. Working with XML from PHP • Lots of options • SimpleXML • DOM 14
  • 15. 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); 15
  • 16. 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" } } 16
  • 17. 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(); 17
  • 18. SimpleXML Example <?xml version="1.0"?> <menus> <menu>Lunch</menu> <menu>Dinner</menu> <menu>Dessert</menu> <menu>Drinks</menu> </menus> 18
  • 19. Serialised PHP • Native to PHP • Useful for values in database • Can also use to move data between PHP applications 19
  • 20. Serialising Data in 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 serialize($menu); a:3:{s:7:"starter";a:2:{i:0;s:14:"prawn cocktail";i:1;s:15:"soup of the day";}s:11:"main course";a:3:{i:0;s:13:"roast chicken";i:1;s:14:"fish'n' chips";i:2;s:15:"macaroni cheese";}s:7:"pudding";a:2: {i:0;s:10:"cheesecake";i:1;s:14:"treacle sponge";}} 20
  • 21. Unserialising Data in PHP 1 <?php 2 3 $serialised = 'a:3:{s:7:"starter";a:2:{i:0;s:14:"prawn cocktail";i:1;s:15:"soup of the day";}s:11:"main course";a:3:{i:0;s:13:"roast chicken";i:1;s:14:"fish 'n' chips";i:2;s:15:"macaroni cheese";}s:7:"pudding";a:2: {i:0;s:10:"cheesecake";i:1;s:14:"treacle sponge";}}'; 4 5 var_dump(unserialize($serialised)); 21
  • 22. Unserialising Data in PHP array(3) { ["starter"]=> array(2) { [0]=> string(14) "prawn cocktail" [1]=> string(15) "soup of the day" } ["main course"]=> array(3) { [0]=> string(13) "roast chicken" [1]=> string(14) "fish 'n' chips" [2]=> string(15) "macaroni cheese" } ["pudding"]=> array(2) { [0]=> string(10) "cheesecake" [1]=> string(14) "treacle sponge" } 22 }
  • 24. Service Types • SOAP • *-RPC – XML-RPC – JSON-RPC • REST 24
  • 25. SOAP • Just "soap" • Defined XML format • Also includes definition for error format • Wrappers available for most languages • Optionally uses a WSDL to describe the service – Web Service Description Language 25
  • 26. Example 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> 26
  • 27. WSDL tips • Read from end to beginning 1.Service location and name 2.Method names and bindings 3.Details of request/response messages 4.Variable names and data types used for each request/response 5.Data type definitions 6.Namespace information 27
  • 28. PHP SOAP Client Example 1 <?php 2 3 ini_set('soap.wsdl_cache_enabled','0'); 4 5 require_once('lib/Snapshot.php'); 6 7 $wsdl = "Service.wsdl"; 8 $client = new SoapClient($wsdl, $params); 9 10 $output = $client->requestShot( 11 'http://www.php.net','', 300, 400); 28
  • 29. Troubleshooting SOAP • Check request – $client->getLastRequest() • Check request headers – $client->getLastRequestHeaders() • Check WSDL • Data types can be an issue between different client/server languages 29
  • 30. HTTP Debugging Tools • cURL – http://curl.haxx.se/ • Wireshark – http://www.wireshark.org/ • Charles – http://www.charlesproxy.com/ 30
  • 31. cURL • cURL is a command-line tool • Simple but powerful • Specify HTTP verb • Observe full request/response headers • Handle cookies 31
  • 32. cURL Cheat Sheet • curl http://localhost • -v to show request/response • -I to show response headers • -X to specify HTTP method • -d to add a data field • -c to store cookies in a cookiejar • -b to use a cookiejar with request 32
  • 37. RPC Services • Remote Procedure Call • Similar to library • Call function with arguments 37
  • 38. Example RPC services • Using Flickr's XML-RPC • Test method: just echoes back to user • XML formatted data 38
  • 39. 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> 39
  • 40. 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); 40
  • 41. 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); 41
  • 42. 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> 42
  • 43. 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 43
  • 44. 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'); 44 19
  • 45. Troubleshooting RPC • Break down into smallest steps • Can you get a response from the service? • Can you log in? • Is there an error? • Try to debug the details of the request/response 45
  • 46. REST • REpresentational State Transfer • Not a protocol • More like a philosophy 46
  • 47. REST Overview • 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 47
  • 48. HTTP Status Codes Code Meaning 200 OK 302 Found 301 Moved 401 Not Authorised 403 Forbidden 404 Not Found 500 Internal Server Error 48
  • 49. REST CRUD Action HTTP Verb Retrieve GET Create POST Update PUT Delete DELETE 49
  • 50. REST Examples • GET – http://localhost/users – http://localhost/users/harry • POST – http://localhost/users • PUT – http://localhost/users/harry • DELETE – http://localhost/users/harry 50
  • 51. REST from PHP: GET 1 <?php 2 3 $result = file_get_contents('http://localhost/users'); 4 var_dump($result); 51
  • 52. 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 52
  • 53. 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); 53
  • 54. 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); 54
  • 55. 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 55
  • 56. Troubleshooting REST • Does resource exist? • Is there a status code? • What does the response body look like? • Intercept web traffic • Use command line curl 56
  • 57. Working with Web Services
  • 58. Working with Web Services • Consuming existing services • Web services overview • Data types • Service types • Debugging • Using services from PHP 58
  • 59. Top tips • If your app can't talk to the service, can you get closer to the service? • If you control both server and client, add debug output • Use proxies to record what happens • Start with the lowest common denominator and work up 59
  • 61. Thankyou! Twitter: @lornajane Website: http://lornajane.net