Three - Tier No More: Integration - Ready Applications with AJAX and WS Samisa Abeysinghe ([email protected]) WSO2 Inc.
Download ReportTranscript Three - Tier No More: Integration - Ready Applications with AJAX and WS Samisa Abeysinghe ([email protected]) WSO2 Inc.
Three - Tier No More: Integration - Ready Applications with AJAX and WS Samisa Abeysinghe ([email protected]) WSO2 Inc. Who am I? A developer Apache Axis2/C and Axis C++ Member of Apache Software Foundation Software Architect WSO2 Inc. Agenda Three-tier to Two-tier XMLHttpRequest Characteristics Introducing SOAPHttpRequest Consuming Web Services WS-* Support REST vs. SOAP Present and the Future Three-tier to Two-tier Web Server Web Client HTTP App Server SOAP App Server Web Client HTTP / SOAP Case for Dropping a Tier Web services – SOAP over HTTP Web browser can handle XML Let browser talk SOAP First Generation - XMLHttpRequest Construct XML representing SOAP envelope SOAP is XML <envelope> <header>...headers...</header> <body>...payload...</body> </envelope> Send over HTTP Concerns You need to build the request SOAP envelope Need to strip SOAP in response First Generation Example xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", "http://api.google.com/search/beta2",true); xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4) { alert(xmlhttp.responseText) } } xmlhttp.setRequestHeader("Man", "POST http://api.google.com/search/beta2 HTTP/1.1") xmlhttp.setRequestHeader("MessageType", "CALL") xmlhttp.setRequestHeader("Content-Type", "text/xml") First Generation Example (Contd.) xmlhttp.send("<?xml version='1.0' encoding='UTF-8'?>"+"\n\n"+ '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">'+ '<soapenv:Body>'+ '<ns1:doSpellingSuggestion xmlns:ns1="urn:GoogleSearch"'+ ' soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"'+ ' xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"'+ ' xmlns:xsd="http://www.w3.org/1999/XMLSchema">'+ '<key xsi:type="xsd:string">TcP7PPxQFHJtaZQO2OzWIPwdu2bUjYKD</key>'+ '<phrase xsi:type="xsd:string">salvasion</phrase>'+ '</ns1:doSpellingSuggestion>'+ '</soapenv:Body>'+ '</soapenv:Envelope>') Next Generation - SOAPHttpRequest Let AJAX handle SOAP for you You just worry about request payload and response payload Inherited form XMLHttpRequest Hence same familiar API Benefit SOAP envelope is handled for you Behind the Scenes Used Apache Axis2/C as base Implemented a Firefox extension Extended Firefox AJAX API Works both on Windows and Linux Planning on an ActiveX object to support Microsoft IE Objectives for SOAPHttpRequest Use an API similar to XMLHttpRequest Shorten learning curve Leverage the power of an existing SOAP engine Axis2/C is written with integration in mind as a portable C library Written to support full web services stack Consuming Web Services Invoking Google spell checker: // create request object var req = new SOAPHttpRequest(); // set SOAP version to be SOAP 1.1 req.soapVer = 1.1; // set callback to be called on response req.onreadystatechange = listenStatus; // set up endpoint information; syntax:open(method, uri, isAsynchronous) req.open("POST", "http://api.google.com/search/beta2", false); // send request with payload req.send (reqContent); Consuming Web Services - Payload XML payload build using DOM API //create the root node var req_node = document.createElementNS ("urn:GoogleSearch", "ns1:doSpellingSuggestion" ); req_node. setAttribute ("xmlns:xsd", "http://www.w3.org/2001/XMLSchema" ); //create the node for key var key_node = document.createElement ("key"); key_node. setAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "type", "xsd:string" ); var key_text = document.createTextNode (key ); key_node.appendChild(key_text); //create the node for phrase |var phrase_node = document.createElement ("phrase"); phrase_node. setAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "type", "xsd:string" ); var phrase_text = document.createTextNode (phrase); phrase_node. appendChild(phrase_text ); //attach nodes req_node. appendChild (key_node ); req_node. appendChild (phrase_node ); reqContent = req_node; //attach nodes req_node. appendChild (key_node ); req_node. appendChild (phrase_node ); reqContent = req_node; Consuming Web Services - Callback Captures result // responseXML contains response dom var resultContent = req. responseXML; // Process result content as you wish HandleResponse (resultContent); XML in/out Model Request <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header></soapenv:Header> <soapenv:Body> <ns1:doSpellingSuggestion xmlns:ns1="urn:GoogleSearch" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <key xsi:type="xsd:string">wCumFQpQFHL7+coIxlNKUGtyVsgrVAnb</key> <phrase xsi:type="xsd:string">tungsston</phrase> </ns1:doSpellingSuggestion> </soapenv:Body> </soapenv:Envelope> Response <?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:doSpellingSuggestionResponse xmlns:ns1="urn:GoogleSearch" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <return xsi:type="xsd:string">tungsten</return> </ns1:doSpellingSuggestionResponse> </SOAP-ENV:Body> Non-Blocking Set the third parameter of open to true req.open("POST", "http://api.google.com/search/beta2", true); WS-* Support Axis2/C designed to support WS-* Concept of modules WS-Addressing built in WS-Security and WS-Reliable Messaging available as separate modules Advantage of using Axis2/C as base Any module available at C level freely available at AJAX level Axis2 Architecture WS-Addressing SOAP Header sample <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> <wsa:To>http://localhost:9090/axis2/services/echo</wsa:To> <wsa:Action>http://ws.apache.org/axis2/c/samples/echoString</wsa:Acti on> <wsa:MessageID>cb00ebf2-39ad-1db1-36e2001125ce1ac4</wsa:MessageID> </soapenv:Header> Need for addressing in enterprise reply to : where to send the reply fault to : where to send the fault e.g. Booking flight: send bill to finance, if error let me know WS-Addressing with AJAX // engage addressing req.engage ( "addressing", "version" ); // set WSA action req.options({ wsa_action:"http://ws.apache.org/axis2/c/samples/echoString" } ); API allows you to select the version Addressing specific parameters could be set as options REST vs. SOAP REST and SOAP are different religions Both have devotees At 30,000 feet REST is light weight; SOAP is heavy weight REST QoS based on transport; SOAP has array of message level QoS options Both has use cases You will need SOAP for some use cases Present You can try WSO2 Tungsten Firefox (v 1.5.0.1) extension Open source with Apache 2.0 license http://dist.wso2.net/products/tungsten/ajax/xpi/installation.h tml Can consume Web services with XML in/out model WS-Addressing and WS-Security UsernameToken integrated Can use both on Linux and Windows with Firefox Future Full WS-Security, MTOM and WS-RM support ActiveX object for Windows IE WS-Policy, WS-Eventing coming up with Axis2/C Would be available to AJAX extension Conclusion Full power of Web services stack available to AJAX programmer Familiar API Based on well designed, proved Apache Axis2 Web services architecture Designed by industry leaders C implementation: fast and portable design Links • WSO2 Tungsten XPI – http://dist.wso2.net/products/tungsten/ajax/xpi/ • Apache Axis2/C – http://ws.apache.org/axis2/c/ • This Presentation – http://people.apache.org/~samisa/ Thank you Time for Q&A