The State of SOAP in PHP

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    5 Favorites

    The State of SOAP in PHP - Presentation Transcript

    1. THE STATE OF SOAP IN PHP
    2. David Zülke
    3. David Zuelke
    4. http://en.wikipedia.org/wiki/File:EU-Germany.svg
    5. http://en.wikipedia.org/wiki/File:München_Panorama.JPG
    6. Founder
    7. awesome
    8. Lead Developer
    9. @dzuelke
    10. WHAT IS SOAP? And How Did It All Start?
    11. original plan
    12. talk
    13. make
    14. Kit tY Inc No lu t de d http://flic.kr/photos/kevinsteele/230997861/
    15. however
    16. http://en.wikipedia.org/wiki/File:Flughafenkontrolle.jpg
    17. risk
    18. or
    19. SHOOT ME IN THE FACE
    20. WHAT IS SOAP? And How Did It All Start?
    21. Data Exchange Protocol
    22. XML-based
    23. typically used for RPC-style Web Services
    24. language independent
    25. platform independent
    26. ORIGINS A Brief History Lesson
    27. < 1998
    28. XML-RPC
    29. XML-RPC sucks
    30. 1998
    31. Simple Object Access Protocol 1.0
    32. 2003
    33. not really simple
    34. renamed
    35. Simple Object Access Protocol
    36. SOAP
    37. SOAP 1.2
    38. GLOSSARY Transports, Messages and WSDL
    39. SOAP TRANSPORTS • Transports are used for message transmission • Most important ones: • HTTP/HTTPS • SMTP
    40. Amazon
    41. 100.000.000.000 SOAP Requests
    42. (per second)
    43. Custom Socket Transport
    44. MESSAGES <?xml version="1.0" encoding="UTF‐8"?> <SOAP‐ENV:Envelope   xmlns:SOAP‐ENV="http:// schemas.xmlsoap.org/soap/envelope/" • Wrapped in an <Envelope>   xmlns:ns1="http://agavi.org/ sampleapp" > • <Header>s and a <Body>   <SOAP‐ENV:Body>     <ns1:getProductResponse>       <product>         <id>123456</id> • Structure is identical for         <name>Red Stapler</name>         <price>3.14</price> Request and Response       </product>     </ns1:getProductResponse>   </SOAP‐ENV:Body> </SOAP‐ENV:Envelope>
    45. but worry not
    46. that’s the entire point of SOAP
    47. WSDL document
    48. describes
    49. • the service • the operations • the data types
    50. <?xml version="1.0" encoding="utf‐8"?> <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http:// schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/ encoding/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://agavi.org/ sampleapp/types" xmlns:asa="http://agavi.org/sampleapp"  name="AgaviSampleApplication" targetNamespace="http://agavi.org/sampleapp">   <wsdl:types>     <xsd:schema xmlns:soap‐enc="http://schemas.xmlsoap.org/soap/encoding/"  targetNamespace="http://agavi.org/sampleapp/types">       <xsd:complexType name="Product">         <xsd:sequence>           <xsd:element name="id" type="xsd:int"/>           <xsd:element name="name" type="xsd:string"/>           <xsd:element name="price" type="xsd:float"/>         </xsd:sequence>       </xsd:complexType>       <xsd:complexType name="ArrayOfProducts">         <xsd:complexContent>           <xsd:extension base="soap‐enc:Array">             <xsd:attribute ref="soap‐enc:arrayType"  wsdl:arrayType="tns:Product[]"/>           </xsd:extension>         </xsd:complexContent>       </xsd:complexType>     </xsd:schema>   </wsdl:types>   <wsdl:portType name="AgaviSampleApplicationPortType">     <wsdl:operation name="getProduct">       <wsdl:input message="asa:getProductRequest"/>       <wsdl:output message="asa:getProductResponse"/>
    51. AN EXAMPLE So we’re all on the same page
    52. $client = new SoapClient('http://acme.com/product.wsdl', array(   'exceptions' => true,   'trace' => true, )); try {   var_dump($client‐>listProducts()); } catch(SoapFault $e) {   // here be dragons } array   0 =>      object(stdClass)[3]       public 'id' => int 8172401       public 'name' => string 'TPS Report Cover Sheet' (length=22)       public 'price' => float 0.89   1 =>      object(stdClass)[4]       public 'id' => int 917246       public 'name' => string 'Weighted Companion Cube' (length=23)       public 'price' => float 129.99
    53. by the way
    54. I will not talk about non-WSDL modes
    55. because using SOAP without a WSDL is stupid
    56. SOAP CLIENTS If You Want To Consume Services OMNOMNOM SERVICE
    57. BASICS $client = new SoapClient(   'http://acme.com/product.wsdl', // URL to WSDL describing the service   array( // array of additional options for the client     'exceptions' => true, // throw SoapFault exceptions on errors     'trace' => true, // allow use of SoapClient::__getLast…()   ) ); $allProducts = $client‐>listProducts(); // $allProducts contains return value
    58. GETTING AVAILABLE FUNCS $client = new SoapClient('http://acme.com/product.wsdl', array(   'exceptions' => true,   'trace' => true, )); var_dump($client‐>__getFunctions()); array   0 => string 'Product getProduct(int $id)' (length=27)   1 => string 'ArrayOfProducts listProducts()' (length=30)
    59. GETTING AVAILABLE TYPES $client = new SoapClient('http://acme.com/product.wsdl', array(   'exceptions' => true,   'trace' => true, )); var_dump($client‐>__getTypes()); array   0 => string 'struct Product {  int id;  string name;  float price; }' (length=55)   1 => string 'Product ArrayOfProducts[]' (length=25)
    60. ADVANCED CONCEPTS Faults, Headers and Mappings
    61. FAULT HANDLING $client = new SoapClient('http://acme.com/product.wsdl', array(   'exceptions' => true,   'trace' => true, )); try {   $newThing = $client‐>createProduct(new stdClass()); } catch(SoapFault $e) {   // could be a client‐side fault e.g. if fields are missing   // or a server‐side fault if the server had any objections :) }
    62. SOAP HEADERS $client = new SoapClient('http://acme.com/product.wsdl', array(   'exceptions' => true,   'trace' => true, )); $client‐>setSoapHeader(   new SoapHeader('http://acme.com/soap/products', 'username', 'Chuck Norris') ); $client‐>setSoapHeader(   new SoapHeader('http://acme.com/soap/products', 'password', 'r0undh0usek!ck') ); // headers will be sent along with the request $allProducts = $client‐>listProducts();
    63. CLASSMAPS class Product {   protected $id, $name, $price;   // imagine getters and setters here } $client = new SoapClient('http://acme.com/product.wsdl', array(   'exceptions' => true,   'trace' => true,   'classmap' => array(     'Product' => 'Product', // no namespace here, which can be problematic…   ), )); var_dump($client‐>getProduct(123456)); object(Product)[2]   protected 'id' => int 123456   protected 'name' => string 'Red Stapler' (length=11)   protected 'price' => float 3.14
    64. TYPEMAPS • Used for custom serialization and deserialization • Needs two callbacks: • one for XML->PHP conversion • one for PHP->XML conversion • Only necessary in very, very rare cases
    65. SOAP SERVERS That’s a bit more difficult
    66. A BASIC SERVER class ProductService {   public function getProduct($id) {     // witchcraft here     return $product;   }   public function listProducts() {     // more witchcraft here     return $products;   } } $server = new SoapServer('/path/to/local/products.wsdl', array(/* options… */)); // register a class to instantiate that has all the methods $server‐>setClass('ProductService'); // alternative: use an existing instance // $server‐>setObject(new ProductService()); // rock and roll $server‐>handle();
    67. you can also register functions instead of class methods
    68. wanna know how?
    69. RTFM :X
    70. DEALING WITH HEADERS class ProductService {   public function getProduct($id) {     // witchcraft here     return $product;   }   public function listProducts() {     // more witchcraft here     return $products;   }   public function username($value) {     // check if it's really chuck norris   }   public function password($value) {     // check if he did a roundhouse kick   } } $server = new SoapServer('/path/to/local/products.wsdl', array(/* options… */)); // register a class to instantiate that has all the methods $server‐>setClass('ProductService'); // rock and roll $server‐>handle();
    71. PRODUCING FAULTS class ProductService {   public function getProduct($id) {     if($product = ProductFinder::retrieveById($id)) {       return $product;     } else {       return new SoapFault('Server', 'No such product');     }   }   public function listProducts() {     // more witchcraft here     return $products;   } }
    72. MULTI-PART RETURN VALUES class ProductService {   public function getTwoThings() {     // rocket science here     return array($foo, $bar);   } }
    73. LITTLE SECRETS Did You Know That ext/soap Supports...
    74. <complexType name="ArrayOfProducts">   <element name="products" type="foo:Product" maxOccurs="unbounded" /> </complexType>
    75. {http://xml.apache.org/xml-soap}Map
    76. LITTLE DISAPPOINTMENTS Things That ext/soap Does Not Support...
    77. DateTime objects
    78. document/literal wrapped
    79. DOS AND DON’TS Keep This In Mind
    80. enable the SOAP_SINGLE_ELEMENT_ARRAYS feature
    81. don’t use SoapServer::fault()
    82. use the exceptions option
    83. double-check soap_use_error_handler()
    84. don’t use cookies or other forms of state, ever
    85. FRAMEWORK HIGHLIGHTS Zend Framework & Agavi
    86. ZEND FRAMEWORK • Zend_Soap_Client as a wrapper for SOAPClient • Zend_Soap_Server as a wrapper for SOAPServer • Zend_Soap_Wsdl for constructing WSDL documents • Zend_Soap_Autodiscover for automatic WSDL generation
    87. Zend_Soap_Autodiscover generates WSDLs for you!
    88. using PHPDoc comments
    89. class AcmeProductService {   /**    * @param      int     The ID of the product.    *    * @return     Product The product object.    *    * @deprecated Call Joe from sales if you want to know details about a product…    */   public function getProduct($id) {     // witchcraft goes here     return $product;   } } $autodiscover = new Zend_Soap_AutoDiscover(); $autodiscover‐>setClass('AcmeProductService'); $autodiscover‐>handle(); // dumps a WSDL
    90. also very nice for prototyping
    91. but might get difficult with complex stuff
    92. AGAVI • Re-use existing Actions for SOAP Services • Needs some information about the service in WSDL format • WSDL auto-generated by the Routing • Requires basic knowledge of XML Schema and WSDL • Supports Document/Literal Wrapped for Servers
    93. Demo
    94. SOAP VERSUS REST Your Thoughts Please
    95. !e End
    96. Questions?
    97. THANK YOU! • Shoot me an E-Mail: david.zuelke@bitextender.com • Follow @dzuelke on Twitter • Slides will be online at http://talks.wombert.de/

    + David ZuelkeDavid Zuelke, 1 month ago

    custom

    460 views, 5 favs, 0 embeds more stats

    Presentation at ZendCon 2009

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 460
      • 460 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 5
    • Downloads 49
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories