WORKING WITH WEB SERVICES. Rob Richards http://xri.net/=rob.richards www.cdatazone.org



Similar documents
SOAP Tips, Tricks & Tools

SOA and WS-BPEL. Composing Service-Oriented Solutions with PHP and ActiveBPEL. Chapter 2 "SOAP Servers and Clients with PHP SOAP Extension"

Web Service Facade for PHP5. Andreas Meyer, Sebastian Böttner, Stefan Marr

PHP Language Binding Guide For The Connection Cloud Web Services

XML Processing and Web Services. Chapter 17

Pre-authentication XXE vulnerability in the Services Drupal module

Cleo Communications. CUEScript Training

CHAPTER 10: WEB SERVICES

17 March 2013 NIEM Web Services API Version 1.0 URI:

CONTRACT MODEL IPONZ DESIGN SERVICE VERSION 2. Author: Foster Moore Date: 20 September 2011 Document Version: 1.7

How to consume a Domino Web Services from Visual Studio under Security

HTTP and HTTPS Statistics Services

Getting started with OWASP WebGoat 4.0 and SOAPUI.

Web Services Tutorial

bbc Developing Service Providers Adobe Flash Media Rights Management Server November 2008 Version 1.5

IBM SPSS Collaboration and Deployment Services Version 6 Release 0. Single Sign-On Services Developer's Guide

API Reference. Nordisk e-handel AB. Version 24

Onset Computer Corporation

This course provides students with the knowledge and skills to develop ASP.NET MVC 4 web applications.

EVALUATION. WA1844 WebSphere Process Server 7.0 Programming Using WebSphere Integration COPY. Developer

DEVELOPING CONTRACT - DRIVEN WEB SERVICES USING JDEVELOPER. The purpose of this tutorial is to develop a java web service using a top-down approach.

Technical documentation

Secure Authentication and Session. State Management for Web Services

A standards-based approach to application integration

Creating SOAP and REST Services and Web Clients with Ensemble

VIRTUAL LABORATORY: MULTI-STYLE CODE EDITOR

WEB SERVICES VULNERABILITIES

Using the Monitoring and Report Viewer Web Services

Q Lately I've been hearing a lot about WS-Security. What is it, and how is it different from other security standards?

What is SOAP MTOM? How it works?

PHP Integration Kit. Version User Guide

Web Service Testing. SOAP-based Web Services. Software Quality Assurance Telerik Software Academy

SoapUI NG Pro and Ready! API Platform Two-Day Training Course Syllabus

vcommander will use SSL and session-based authentication to secure REST web services.

NEMSIS v3 Web Services Guide

Module 4: File Reading. Module 5: Database connection

PowerCenter Real-Time Development

The presentation explains how to create and access the web services using the user interface. WebServices.ppt. Page 1 of 14

Developing and Implementing Windows-Based Applications With Microsoft Visual C#.NET and Microsoft Visual Studio.NET

Connecting Custom Services to the YAWL Engine. Beta 7 Release

WIRIS quizzes web services Getting started with PHP and Java

Web Application Report

soapui Client Testing ecrv Web Services with soapui 1 9/20/2012 First edition soapui-x ecrv Development Team

PHP Magic Tricks: Type Juggling. PHP Magic Tricks: Type Juggling

Example for Using the PrestaShop Web Service : CRUD

Computer Networking LAB 2 HTTP

J j enterpririse. Oracle Application Express 3. Develop Native Oracle database-centric web applications quickly and easily with Oracle APEX

11/1/2013. Championing test automation at a new team: The challenges and benefits. Alan PNSQC About you?

Automating the DEVS Modeling and Simulation Interface to Web Services

HexaCorp. White Paper. SOA with.net. Ser vice O rient ed Ar c hit ecture

Consuming and Producing Web Services with Web Tools. Christopher M. Judd. President/Consultant Judd Solutions, LLC

RDS Building Centralized Monitoring and Control

Improving performance for security enabled web services. - Dr. Colm Ó héigeartaigh

Intro to Web Programming. using PHP, HTTP, CSS, and Javascript Layton Smith CSE 4000

Mobility Information Series

E-invoice manual Instruction for a client implementation of the B2B web service

SOAP Web Services Attacks

THE CHALLENGE OF ADMINISTERING WEBSITES OR APPLICATIONS THAT REQUIRE 24/7 ACCESSIBILITY

Consuming and Producing Web Services with WST and JST. Christopher M. Judd. President/Consultant Judd Solutions, LLC

SharePoint Integration Framework Developers Cookbook

Using mobile phones to access Web Services in a secure way. Dan Marinescu

StreamServe Persuasion SP4 Service Broker

Developing and Implementing Web Applications with Microsoft Visual C#.NET and Microsoft Visual Studio.NET

Websense SQL Queries. David Buyer June 2009

Extensible Markup Language (XML): Essentials for Climatologists

Pervasive Data Integrator. Oracle CRM On Demand Connector Guide

... Introduction... 17

Web Development using PHP (WD_PHP) Duration 1.5 months

Xtreeme Search Engine Studio Help Xtreeme

Oracle Application Server 10g Web Services Frequently Asked Questions Oct, 2006

Contents. 2 Alfresco API Version 1.0

Testing the API behind a mobile app. Tutorial Marc van t Veer

Project 2: Web Security Pitfalls

IBM WebSphere ESB V6.0.1 Technical Product Overview

Copyright 2013 Consona Corporation. All rights reserved

Bubble Code Review for Magento

INSTALLATION AND CONFIGURATION MANUAL ENCODER

Digital Signature Web Service Interface

CA Nimsoft Service Desk

Supporting Data Set Joins in BIRT

General principles and architecture of Adlib and Adlib API. Petra Otten Manager Customer Support

Examples with.net & PHP. Martin Haagen, QlikTech, Systems Manager;

Building and Using Web Services With JDeveloper 11g

Instructions for Embedding a Kudos Display within Your Website

soapui Product Comparison

Brekeke PBX Web Service

Web Services Development Guide: How to build EMBRACE compliant Web Services Version 2.0, 13 December 2006

Accessing Data with ADOBE FLEX 4.6

DEPLOYMENT GUIDE DEPLOYING THE BIG-IP LTM SYSTEM WITH CITRIX PRESENTATION SERVER 3.0 AND 4.5

Help on the Embedded Software Block

File Transfer Service (Batch SOAP) User Guide. A Guide to Submitting batches through emedny FTS

Unleash the Power of e-learning

Testing the API behind a mobile app

e-filing Secure Web Service User Manual

Integration of Hotel Property Management Systems (HPMS) with Global Internet Reservation Systems

PerfectForms SharePoint Integration

Introduction to Testing Webservices

Web-Services Testing Tools

External Vulnerability Assessment. -Technical Summary- ABC ORGANIZATION

Transcription:

WORKING WITH WEB SERVICES Rob Richards http://xri.net/=rob.richards www.cdatazone.org

Helpful Tools soapui http://www.soapui.org/ Multiple platforms Free & enhanced Pro versions SOAPSonar http://www.crosschecknet.com/ Windows only Personal (Free) and Professional versions Misc. XML Editors XML NotePad 2007 (Microsoft) XML Spy (Altova) Oct 9, 2007 WORKING WITH WEB SERVICES 2

soapui Features Web Service Inspection WSDL Inspector HTTP data inspection (request & response) Web Service Invocation Automatic Request generation Authentication support (Basic, Digest, WS-Security) Custom HTTP Header support Web Service Development and Validation Web Service Functional Testing Web Service Load Testing Web Service Simulation Oct 9, 2007 WORKING WITH WEB SERVICES 3

Oct 9, 2007 WORKING WITH WEB SERVICES 4

Making SOAP Requests Tips and Tricks working with the SoapClient

Canadian Cattle Identification Agency (CCIA) Handles cattle age verification Provides a centralized database where producers can maintain their cattle information Information is readily available to help speed up import/exports Information can be correlated with RFID tags System is entirely online SOAP is used for application integration Website: http://www.canadaid.ca/ Oct 9, 2007 WORKING WITH WEB SERVICES 6

CCIA: Retrieve API Information $wsdl = 'https://www.clia.livestockid.ca/clts/public/help/en/ webservices/webserviceanimalsearch/ianimalsearchwsv2.wsdl'; @$client = new SOAPClient($wsdl); $types = $client-> gettypes(); foreach ($types AS $type) { print $type."\n\n"; $functions = $client-> getfunctions(); foreach ($functions AS $function) { print $function."\n\n"; Oct 9, 2007 WORKING WITH WEB SERVICES 7

CCIA: Can We Be Any More Descriptive? com_clarkston_cts_webservice_animal_search_value_animalsearchresultwsvalue executesearch (com_clarkston_cts_webservice_animal_search_value_animalsearchcriteriawsv alue $criteria) struct com_clarkston_cts_webservice_animal_search_value_animalsearchcriteriawsv alue { ArrayOfcom_clarkston_cts_webservice_value_TagRangeWSValue tagrangelist; string publicaccountid; struct com_clarkston_cts_webservice_value_tagrangewsvalue { string tagtype; string endtag; string starttag; com_clarkston_cts_webservice_value_tagrangewsvalue ArrayOfcom_clarkston_cts_webservice_value_TagRangeWSValue[] Oct 9, 2007 WORKING WITH WEB SERVICES 8

CCIA: Functions and Types Translated AnimalResult executesearch(animalcriteria $criteria) struct TagRange { string tagtype; string endtag; string starttag; TagRange ArrayOfTagRange[] struct AnimalCriteria { ArrayOfTagRange tagrangelist; string publicaccountid; Oct 9, 2007 WORKING WITH WEB SERVICES 9

CCIA: Making The Request try { $client = new SoapClient($wsdl); $stag = '000000124000050000102'; $etag = '000000124000050000106'; $tag1 = array('starttag'=>$stag, 'endtag'=>$etag, 'tagtype'=>'c'); $trangelist = array($tag1); $res = $client->executesearch(array('tagrangelist'=>$trangelist, 'publicaccountid'=>"")); var_dump($res); catch (SoapFault $e) { var_dump($e); Oct 9, 2007 WORKING WITH WEB SERVICES 10

CCIA: DOH!... Denied object(soapfault)#3 (9) {... ["faultstring"]=> string(273) "No Deserializer found to deserialize a 'http://com.clarkston.cts.webservice.animal.search/iani malsearchwsv2.xsd:arrayofcom_clarkston_cts_webs ervice_value_tagrangewsvalue' using encoding style 'http://schemas.xmlsoap.org/soap/encoding/'. [java.lang.illegalargumentexception]" ["faultcode"]=> string(15) "SOAP-ENV:Client" ["faultactor"]=> string(22) "/CLTS/AnimalSearchWSv2" Oct 9, 2007 WORKING WITH WEB SERVICES 11

CCIA: Capturing the Request $client_options = array ('trace'=>1); $client = new SoapClient($wsdl, $client_options); try { /* code edited for brevity */ $res = $client->executesearch(array('tagrangelist'=>$trangelist, 'publicaccountid'=>"")); catch (SoapFault $e) { print $client-> getlastrequest(); Oct 9, 2007 WORKING WITH WEB SERVICES 12

CCIA: Capturing Messages Be careful when capturing the output from getlastrequest() or getlastresponse() Pipe the output to a file php myclient.php > request.php Capture it to a variable $request = $client-> getlastrequest(); file_put_contents('request.xml', $request); Oct 9, 2007 WORKING WITH WEB SERVICES 13

CCIA: The SOAP Request (edited) <ns1:executesearch> <criteria xsi:type="ns2:animalsearchcriteriawsvalue"> <tagrangelist SOAP-ENC:arrayType="ns2:TagRange[1]" xsi:type="ns2:arrayoftagrange"> <item xsi:type="ns2:tagrange"> <tagtype xsi:type="xsd:string">c</tagtype> <endtag xsi:type="xsd:string">...000106</endtag> <starttag xsi:type="xsd:string">...000102</starttag> </item> </tagrangelist> <publicaccountid xsi:type="xsd:string"/> </criteria> </ns1:executesearch> Oct 9, 2007 WORKING WITH WEB SERVICES 14

CCIA: Accessing The Request class CustomSoapClient extends SoapClient { function dorequest($request, $location, $saction, $version) { $doc = new DOMDocument(); $doc->loadxml($request); /* Modify SOAP Request held within $doc */ return parent:: dorequest($doc->savexml(), $location, $saction, $version); Oct 9, 2007 WORKING WITH WEB SERVICES 15

CCIA: Modifying The Request $root = $doc->documentelement; $encprefix = $root->lookupprefix('http://schemas.xmlsoap.org/soap/encoding/'); $xpath = new DOMXPath($doc); $xpath->registernamespace("myschem", 'http://.../xmlschema-instance'); $xpath->registernamespace("myxsi", 'http://schemas.xmlsoap.org/soap/...'); $query = '/*/*/*//*[@myxsi:arraytype and @myschem:type]'; if ($nodelists = $xpath->query($query)) { foreach ($nodelists AS $node) { if ($attnode = $node->getattributenodens('http://www.w3.org/2001/xmlschema-instance', 'type')) { $attnode->nodevalue = $encprefix.':array'; Oct 9, 2007 WORKING WITH WEB SERVICES 16

CCIA: The Altered Request <ns1:executesearch> <criteria xsi:type="ns2:animalsearchcriteriawsvalue"> <tagrangelist SOAP-ENC:arrayType="ns2:TagRange[1]" xsi:type="soap-enc:array"> <item xsi:type="ns2:tagrange"> <tagtype xsi:type="xsd:string">c</tagtype> <endtag xsi:type="xsd:string">...000106</endtag> <starttag xsi:type="xsd:string">...000102</starttag> </item> </tagrangelist> <publicaccountid xsi:type="xsd:string"/> </criteria> </ns1:executesearch> Oct 9, 2007 WORKING WITH WEB SERVICES 17

CCIA: How Did You Get The Request? $client_options = array ('trace'=>1); $client = new CustomSoapClient($wsdl, $client_options); try { /* code edited for brevity */ $res = $client->executesearch(array('tagrangelist'=>$trangelist, 'publicaccountid'=>"")); $res-> getlastrequest() /* Still shows bad message */ Messages altered within dorequest() are not reflected when getlastrequest() is called View the raw XML from the DOMDocument within dorequest print $doc->savexml(); Oct 9, 2007 WORKING WITH WEB SERVICES 18

CCIA: Handling SOAP-ENC:Array w/ PHP 5.2 $client_options = array( 'features'=>soap_use_xsi_array_type); $client = new SoapClient($wsdl, $client_options); $stag = '000000124000050000102'; $etag = '000000124000050000106'; $tag1 = array('starttag'=>$stag, 'endtag'=>$etag, 'tagtype'=>'c'); $trangelist = array($tag1); $res = $client->executesearch(array('tagrangelist'=>$trangelist, 'publicaccountid'=>"")); Oct 9, 2007 WORKING WITH WEB SERVICES 19

ExactTarget Provide tools and services for email communications Focus on Email Marketing On-Demand Access Personal Interaction via Web-based GUI Application integration via REST and/or SOAP SOA based SOAP interface Oct 9, 2007 WORKING WITH WEB SERVICES 20

ExactTarget: Retrieve API information $wsdl = 'https://webservice.exacttarget.com/etframework.wsdl'; @$client = new SOAPClient($wsdl, array('trace'=>1)); $types = $client-> gettypes(); foreach ($types AS $type) { print $type."\n\n"; $functions = $client-> getfunctions(); foreach ($functions AS $function) { print $function."\n\n"; Oct 9, 2007 WORKING WITH WEB SERVICES 21

ExactTarget Functions CreateResponse Create(CreateRequest $parameters) RetrieveResponseMsg Retrieve(RetrieveRequestMsg $parameters) UpdateResponse Update(UpdateRequest $parameters) DeleteResponse Delete(DeleteRequest $parameters) ExecuteResponseMsg Execute(ExecuteRequestMsg $parameters) Oct 9, 2007 WORKING WITH WEB SERVICES 22

ExactTarget: RetrieveRequestMsg struct RetrieveRequestMsg { RetrieveRequest RetrieveRequest; struct RetrieveRequest { ClientID ClientIDs; string ObjectType; string Properties; FilterPart Filter; AsyncResponse RespondTo; APIProperty PartnerProperties; string ContinueRequest; boolean QueryAllAccounts; boolean RetrieveAllSinceLastBatch; Oct 9, 2007 WORKING WITH WEB SERVICES 23

ExactTarget: Basic List Retrieval Request @$client = new ExactTargetSoapClient($wsdl, $options); /* WS-Security Username handling */ $request = new ExactTarget_RetrieveRequestMsg(); $rr = new ExactTarget_RetrieveRequest(); $rr->objecttype = "List"; $rr->properties = array("listname"); $request->retrieverequest = $rr; $response = $client->retrieve($request); Oct 9, 2007 WORKING WITH WEB SERVICES 24

ExactTarget: List Retrieval Response object(stdclass)#6 (3) { ["OverallStatus"]=> string(2) "OK" ["RequestID"]=> string(36) "6bb27c71-16e6-4167-a57c-32df045174c4" ["Results"]=> array(2) { [0]=> object(stdclass)#12 (3) { ["PartnerKey"]=> NULL ["ObjectID"]=> NULL ["ListName"]=> string(8) "RobsList" [1]=> object(stdclass)#8 (3) { ["PartnerKey"]=> NULL ["ObjectID"]=> NULL ["ListName"]=> string(12) "New Rob List" Oct 9, 2007 WORKING WITH WEB SERVICES 25

ExactTarget: FilterPart Definition From RetrieveRequest Definition: FilterPart Filter; FilterPart Definition: struct FilterPart { Oct 9, 2007 WORKING WITH WEB SERVICES 26

ExactTarget: Using a FilterPart <complextype name="simplefilterpart"> <complexcontent> <extension base="tns:filterpart"> <sequence> <element name="property" type="xsd:string" minoccurs="1" maxoccurs="1" /> <element name="simpleoperator" type="tns:simpleoperators" minoccurs="1" maxoccurs="1" /> <element name="value" type="xsd:string" minoccurs="0" maxoccurs="unbounded" /> <element name="datevalue" type="xsd:datetime" minoccurs="0" maxoccurs="unbounded" /> </sequence> </extension> </complexcontent> </complextype> Oct 9, 2007 WORKING WITH WEB SERVICES 27

ExactTarget: Filtering Requests $sfp = new ExactTarget_SimpleFilterPart(); $sfp->property = "ListName"; $sfp->simpleoperator = ExactTarget_SimpleOperators::equals; $sfp->value = array("robslist"); $rr->filter = $sfp; Oct 9, 2007 WORKING WITH WEB SERVICES 28

ExactTarget: Filter Results object(stdclass)#7 (2) { ["OverallStatus"]=> string(60) "Error: Object reference not set to an instance of an object." ["RequestID"]=> string(36) "9c7ebf66-d211-43cf-9984-0adfb4b1e476" This Doesn't Look Right! Oct 9, 2007 WORKING WITH WEB SERVICES 29

ExactTarget: Examining The Request <SOAP-ENV:Envelope xmlns:soap-env="..." xmlns:ns1="http://exacttarget.com/wsdl/partnerapi"> <SOAP-ENV:Body> <ns1:retrieverequestmsg> <ns1:retrieverequest> <ns1:objecttype>list</ns1:objecttype> <ns1:properties>listname</ns1:properties> <ns1:filter/> <!-- Where is our Filter??? --> </ns1:retrieverequest> </ns1:retrieverequestmsg> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Oct 9, 2007 WORKING WITH WEB SERVICES 30

ExactTarget: Using The SoapVar Class class SoapVar { construct ( mixed $data, int $encoding [, string $type_name [, string $type_namespace [, string $node_name [, string $node_namespace]]]] ) Oct 9, 2007 WORKING WITH WEB SERVICES 31

ExactTarget: Using The SoapVar Class $soapvar = new SoapVar( $sfp, /* data */ SOAP_ENC_OBJECT, /* encoding */ 'SimpleFilterPart', /* type_name */ "http://exacttarget.com/wsdl/partnerapi" /* type ns */ ); $rr->filter = $soapvar; Oct 9, 2007 WORKING WITH WEB SERVICES 32

ExactTarget: Filtered Results object(stdclass)#8 (3) { ["OverallStatus"]=>string(2) "OK" ["RequestID"]=>string(36) "638f2307-xxxxxxxx" ["Results"]=> object(stdclass)#14 (3) { ["PartnerKey"]=>NULL ["ObjectID"]=>NULL ["ListName"]=>string(8) "RobsList" Oct 9, 2007 WORKING WITH WEB SERVICES 33

ExactTarget: Examining The Request (Take 2) <!-- Only internal struct of the envelope displayed --> <ns1:retrieverequest> <ns1:objecttype>list</ns1:objecttype> <ns1:properties>listname</ns1:properties> <ns1:filter xsi:type="ns1:simplefilterpart"> <ns1:property>listname</ns1:property> <ns1:simpleoperator>equals</ns1:simpleoperator> <ns1:value>robslist</ns1:value> </ns1:filter> </ns1:retrieverequest> Oct 9, 2007 WORKING WITH WEB SERVICES 34

Server Sided SOAP Working through server sided issues

SoapServer: WSDL Caching DISABLE WSDL CACHING WHEN DEVELOPING! ini_set("soap.wsdl_cache_enabled", "0"); Oct 9, 2007 WORKING WITH WEB SERVICES 36

SoapServer: Handling Requests The typical method to process a SOAP request $soapserver->handle(); Request may be passed to handler $soapserver->handle($request); Passing in the request is handy in a number of cases You can be guaranteed of the same request while debugging Debugging can be performed via CLI Requests can be modified prior to being processed Oct 9, 2007 WORKING WITH WEB SERVICES 37

SoapServer: Handling Requests /* create the initial request to be re-used */ $request = file_get_contents("php://input"); file_save_contents('debugging.xml', $request); /* retrieve the saved request on subsequent calls $request = file_get_contents('debugging.xml'); */ $server = new SoapServer($wsdl); /* Setup function handlers */ $server->handle($request); Oct 9, 2007 WORKING WITH WEB SERVICES 38

Swiss Army SOAP When All Else Fails

Typemap: Custom Serial/De-Serialization A SOAP option for both client and server Specifies functions to use to convert objects to XML (to_xml) and XML to objects (from_xml) based on type $typemap = array( array("type_name" => <name of type>, "type_ns" => <namespace of type>, "to_xml" => <function to convert obj to xml>, "from_xml" => <function to convert xml to obj> ) ); Oct 9, 2007 WORKING WITH WEB SERVICES 40

Typemap: WSDL function and Types struct Quote { string Symbol; float Quote; struct Quotes { Quote Quote; struct Companies { string Symbol; Quotes getquote(companies $parameters) Oct 9, 2007 WORKING WITH WEB SERVICES 41

Typemap: SoapClient Example function compserial($obj) { return '<Companies xmlns="http://example.org/stockquote"> <Symbol>msft</Symbol> </Companies>'; $typemap = array( array("type_name" => "Companies", "type_ns" => "http://example.org/stockquote", "to_xml" => "compserial")); $options = array("typemap"=>$typemap); $client = new SoapClient('localtest.wsdl', $options); $test = $client->getquote(array("symbol" => array("ibm"))); Oct 9, 2007 WORKING WITH WEB SERVICES 42

Typemap: SoapClient Request <SOAP-ENV:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.org/stockquote"> <SOAP-ENV:Body> <ns1:companies xmlns="http://example.org/stockquote"> <Symbol>msft</Symbol> </ns1:companies> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Oct 9, 2007 WORKING WITH WEB SERVICES 43

Typemap: SoapServer Example function quotetoxml($obj) { return '<Quotes xmlns="http://example.org/stockquote">'. '<Quote><Symbol>yhoo</Symbol><Quote>35</Quote></Quote>'. '</Quotes>'; function getquote($objs) { return array("quote"=>array(array('symbol'=>'ibm', 'Quote'=>1))); $tmap = array(array("type_name"=>"quotes", "type_ns"=>"http://example.org/stockquote", "to_xml"=>"quotetoxml")); $server = new SoapServer('localtest.wsdl', array("typemap"=>$tmap)); $server->addfunction("getquote"); $server->handle(); Oct 9, 2007 WORKING WITH WEB SERVICES 44

Typemap: SoapServer Response <SOAP-ENV:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.org/stockquote"> <SOAP-ENV:Body> <ns1:quotes xmlns="http://example.org/stockquote"> <Quote> <Symbol>yhoo</Symbol> <Quote>35</Quote> </Quote> </ns1:quotes> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Oct 9, 2007 WORKING WITH WEB SERVICES 45

Questions? WORKING WITH WEB SERVICES Rob Richards http://xri.net/=rob.richards http://www.cdatazone.org Oct 9, 2007 WORKING WITH WEB SERVICES 46