<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>spikes</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/" />
<modified>2007-04-18T01:06:32Z</modified>
<tagline>Random spikes from Chris Fry&apos;s brain.</tagline>
<id>tag:www.cfry.net,2007:/blog/spikes//2</id>
<generator url="http://www.movabletype.org/" version="3.01D">Movable Type</generator>
<copyright>Copyright (c) 2007, Chris</copyright>
<entry>
<title>Creating your first Apex Code</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2007/04/creating_your_f.html" />
<modified>2007-04-18T01:06:32Z</modified>
<issued>2007-04-18T00:51:45Z</issued>
<id>tag:www.cfry.net,2007:/blog/spikes//2.108</id>
<created>2007-04-18T00:51:45Z</created>
<summary type="text/plain">One of the amazing things that is going on at Salesforce right now is we are creating our own on demand programming language. It&apos;s really easy to create a Hello World example using Apex Code in Salesforce. Right now you...</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>One of the amazing things that is going on at Salesforce right now is we are creating our own on demand programming language.  It's really easy to create a Hello World example using Apex Code in Salesforce.  Right now you can create your own custom web service by simply putting the key word 'WebService' in front of your method.</p>

<p>1) To make this work you just need an Apex Code enabled DE org.</p>

<p>2) read these docs </p>

<p><a href="http://www.salesforce.com/us/developer/docs/apexcode/salesforce_apex_language_reference.pdf">http://www.salesforce.com/us/developer/docs/apexcode/salesforce_apex_language_reference.pdf</a></p>

<p>Instead of doing the extended example in the docs create a simple hello world apex example.  Here is the code:</p>

<p><strong>package myFirstPackage {<br />
   webService String helloWorld(String name){<br />
      return 'Hello '+name;<br />
   }<br />
}</strong></p>

<p>3) Now install the Ajax Toolkit in your DE org</p>

<p><a href="http://www.salesforce.com/appexchange/detail_overview.jsp?id=a0330000002foeKAAQ&NavCode__c=">http://www.salesforce.com/appexchange/detail_overview.jsp?id=a0330000002foeKAAQ&NavCode__c=</a></p>

<p>4) And go into your DE org and execute it, you get a nice UI to edit and execute your example.  This link will give you help on using the Ajax toolkit</p>

<p><a href="http://wiki.apexdevnet.com/index.php/Ajax_Tools">http://wiki.apexdevnet.com/index.php/Ajax_Tools</a></p>

<p><br />
That's it for HelloWorld running server side inside the Apex Platform.</p>]]>

</content>
</entry>
<entry>
<title>Contract driven communication</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2006/08/contract_driven.html" />
<modified>2006-08-11T04:19:36Z</modified>
<issued>2006-08-11T04:05:23Z</issued>
<id>tag:www.cfry.net,2006:/blog/spikes//2.92</id>
<created>2006-08-11T04:05:23Z</created>
<summary type="text/plain">Pete, Manoj, Alex and I went for coffee today. It was just after we had spent a couple hours testing the new version of Salesforce.com that we are getting ready to deploy. One of the topics that Pete has been...</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p><a href="http://www.dapkus.com/blogs/rosewater/">Pete</a>, <a href="http://manojc.com/">Manoj</a>, Alex and I went for coffee today.  It was just after we had spent a couple hours testing the new version of Salesforce.com that we are getting ready to deploy.  One of the topics that Pete has been talking about lately is contract driven services, should they be client driven or server driven?</p>

<p>He had a key insight today which is: although our service is server contract driven, our query languages (<a href="http://www.sforce.com/us/docs/sforce70/wwhelp/wwhimpl/common/html/wwhelp.htm?context=sforceAPI_WWHelp&file=sforce_API_calls_SOQL.html">SOQL</a>/<a href="http://www.sforce.com/us/docs/sforce70/wwhelp/wwhimpl/common/html/wwhelp.htm?context=sforceAPI_WWHelp&file=sforce_API_calls_SOSL.html">SOSL</a>) force/allow clients to declare what data and fields the client is interested in.  "SELECT * FROM account" is illegal, but "SELECT id,name  FROM account" is legal.</p>

<p>So clients must declare what data they are interested in.  The server defines the total space of data but the client can protect itself from additive changes to the data objects by directly requesting the objects and fields.</p>

<p>So we have a very flexible client driven, server declared contract system.</p>]]>

</content>
</entry>
<entry>
<title>Salesforce API traffic due to lack of joins?</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2006/07/salesforce_api.html" />
<modified>2006-07-30T05:27:59Z</modified>
<issued>2006-07-30T05:23:48Z</issued>
<id>tag:www.cfry.net,2006:/blog/spikes//2.90</id>
<created>2006-07-30T05:23:48Z</created>
<summary type="text/plain">My API post got a little reaction here at the heretic site. One of his points is that we need a way to create more complex queries that allow you to aggregate data before you return it to the client....</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>My API post got a little reaction here at the <a href="http://sfdc-heretic.warped-minds.com/2006/07/28/why-over-40-of-salesforcecoms-traffic-is-web-services-the-heretics-view/">heretic </a>site.  One of his points is that we need a way to create more complex queries that allow you to aggregate data before you return it to the client.  I couldn't agree more.  This is one of our most frequently requested API features.  I can't promise anything but you should be able to do this in an upcoming release.</p>]]>

</content>
</entry>
<entry>
<title>Why over 40% of Salesforce.com’s traffic is Web Services</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2006/07/why_over_40_of.html" />
<modified>2006-07-28T23:07:59Z</modified>
<issued>2006-07-28T21:32:00Z</issued>
<id>tag:www.cfry.net,2006:/blog/spikes//2.88</id>
<created>2006-07-28T21:32:00Z</created>
<summary type="text/plain">I wrote this article when I started at Salesforce, with the intention of publishing it somewhere on the web. Salesforce.com has designed one of the web’s most successful Web Services. More than 40% of the site’s traffic and over 10...</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>I wrote this article when I started at Salesforce, with the intention of publishing it somewhere on the web.  </p>

<p>Salesforce.com has designed one of the web’s most successful Web Services.   More than 40% of the site’s traffic and over 10 million calls a day come through Web Services.  This article discusses the design principles behind the Salesforce.com Web Service API , features of the API itself, gives examples of how to use it, and considers the future of service-based infrastructure.</p>]]>
<![CDATA[<p><strong>Enterprise Software as a Service</strong></p>

<p>Businesses are starting to realize the benefits of software as a service.  Although businesses have been outsourcing functionality for years, they are now replacing packaged software with internet services that provide equivalent or better features and functionality.  This is happening for several reasons:</p>

<p>•	Up-front costs are low and customers pay for just what they use.<br />
•	Operating costs are reduced because the infrastructure is built-out by the service provider.<br />
•	It is cheaper for the software producer to create the software because there is only one environment (no porting required) allowing more resources to focus on application enhancements.<br />
•	There is no need to go through costly upgrades.  <br />
•	Recent messaging standards (WSDL/SOAP) allow easy data integration with remote services.</p>

<p>These benefits and more are discussed in [1].  The success of Salesforce.com in the CRM (Customer Relationship Management) market and as an application platform has been driven by many of the above factors.  One of the key factors driving Salesforce.com’s success is a Web Service API that allows businesses to integrate with data remotely and automatically.  </p>

<p><strong>Hosted CRM</strong><br />
<em>Remote and automated access</em><br />
Some of the most successful services on the web today never result in a web page being rendered on a browser.  Instead they involve automated communication between computers.  For a user of an on-demand service it is crucial to be able to retrieve data and synchronize it with other clients such as email and calendaring programs and repositories like SAP.   The huge growth of Salesforce.com’s online application has driven corresponding growth in the associated Web Service API which allows programmatic access to all user data in the system.  </p>

<p>Customers and partners use the API to integrate and extend Salesforce.com’s hosted CRM solution to provide new application functionality.   Examples include mirroring data, bulk data transfer, data cleansing, and various other custom functionality.   It is possible to use the customization properties of the Salesforce.com application and the API to create completely new internet-ready applications.   Several key design decisions and design principles have governed the creation of this API and are discussed in the next section.</p>

<p><strong>API Design</strong><br />
Designing an API that functions on the scale of the internet involves following a set of design principles.  This section describes the principles that drive a successful web service:   1) KISS (Keep it Simple, Stupid); 2) No new verbs / <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm">REST</a>; 3) Design for scalability & backwards compatibility;  4) Be open 5) Dog-Fooding. The first section describes the principles and the second talks about how these have been used to guide the design of the Salesforce.com API.</p>

<p><strong><br />
General Design Strategies</strong><br />
A well-designed API is simple, intuitive and easy to use.  It uses only the constructs needed,  has no unnecessary constraints or operations.  The method names should be succinct and have no unknown side effects.  With little or no documentation someone should be able to write a “Hello World” style example.  Strong-typing should be used to clearly communicate the structures that interact with the API verbs.  Generic data structures can be used to provide a more powerful API that allows programs to operate on meta-data to create generic tools.  Some of the best designs allow programmers to choose when they want the compile-time type checking of strong typing or the power of a generic programming style.</p>

<p>REST (Representational State Transfer)[<a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm">3</a>] is an architectural style that describes how the internet operates at the highest level.   People typically associate REST with HTTP/XML and URLs.  In a typical REST system the URLs define the location of the resources, the XML defines the resource state and HTTP defines the methods that operate on the state (basically HTTP POST and HTTP GET).   Verbs are the operations that act on data in an API.   Objects or nouns are retrieved but not modified by referring to their URL using a GET.  The state can be modified and put back with a POST.  This same style of interaction can be enabled with WSDL and SOAP.  Although REST is typically associated with HTTP and XML these technologies are not required for implementing a RESTful service.  Limiting the number of verbs in the system makes it easier to upgrade and add new functionality.</p>

<p>Backwards compatibility and scalability are crucial with an on-demand service as customers do not control when they receive new versions of the service and may be sharing computational infrastructure.  Compatibility can be guaranteed by keeping previous versions intact in a parallel runtime environment.  <br />
   <br />
‘Being open’ means using standards where possible and allowing free access to data in the application.  Standards provide an ecosystem that supports knowledge transfer, investment protection and interoperability.  They give developers the ability to apply tricks learned elsewhere on a current product.  Consumers are free to choose among competing standard implementations.  Finally by focusing on standard wire-level protocols different products can interoperate and integrate.</p>

<p>Dog-fooding is the practice of using a software product to build or test itself (“Eating your own dogfood”).  Although not specific to API design it’s a good practice in general for creating quality products. </p>

<p><strong>The Salesforce.com API</strong><br />
This section describes how the Salesforce.com API was designed following the above principles.</p>

<p>The Salesforce.com API provides a simple way to set and get application data.   Creating a client application is a very short process using Java or .NET Web Service tools.  WSDLs that describe services in the API can be either strongly or weakly typed against user data.  Users have the option of creating a WSDL that will describe their custom objects in XML Schema.  This is done automatically for each customer, and called the Enterprise WSDL.  Objects are always available using the generic methods but it’s often easier to write integrations that have compile-time type checking.  Modern development tools with code completion work well with strongly typed WSDLs.  A loosely-typed WSDL would work for all customers, however Salesforce.com maintains custom WSDL files for each customer so that it’s easier to program using tools such as Visual Studio, Eclipse, IntelliJ , and others.  </p>

<p>To retrieve data, Salesforce designed a language called SOQL (Salesforce Object Query Language).  This looks similar to SQL, a language almost all enterprise programmers are familiar with.  This language is most like object-query languages like hibernates HQL.</p>

<p>Since REST is an architectural style and not a set of technologies, it is possible to create a REST-like API that uses XML to define the state and WSDL operations to define the put and get operations.   The main operations are retrieve, create,  update, query and delete.  All these operations work on objects or arrays of objects.  Retrieve allows you to retrieve an object based on its ID.  The object IDs are globally unique in the system and uniquely identify an object.</p>

<p>These methods, unique IDs and object state result in a RESTful system of named resources (objects), that are processed using a generic, uniform interface, and are interconnected using unique IDs to allow navigation. In general Salesforce.com tries to rarely add verbs and rely on only additive changes to the metadata for backward compatibility.   Client code rarely has to deal with new verbs, allowing customers to upgrade to new versions with little or no modifications to their code.</p>

<p>Backwards compatibility is guaranteed by versioning the service and keeping old API stacks running.   The new versions run side-by-side with the old versions, allowing existing integrations to continue running with no side-effects of code change after a service upgrade.  Each SOAP message contains the specific version of the service that it is addressing allowing the server side to adapt its behavior based on API version.  Clients are designed to support additive changes to the nouns, allowing existing integrations to seamlessly move forward to new API versions to take advantage of performance and/or functionality enhancements.</p>

<p>Salesforce.com handles more than 10 million calls a day through its web service API.  Traffic of this magnitude requires an efficient and scalable processing platform.  All calls to the API are stateless but have an associated session ID that allows the server to correlate state with the request.   Methods are designed to execute quickly and to return large datasets in chunks.  The API is designed to chunk data into blocks on the server side allowing the client code to cursor over the data.</p>

<p>Salesforce.com adheres to web services standards.  The service is tested against WS-I BP 1.1 to ensure compatibility.  Additionally, documentation, free trial accounts and community messages boards are all available for free at sforce.com.  This ensures the API works with all tools that support web services.</p>

<p>Salesforce.com has a long history of incremental, adaptive, improvement.  This is summarized in [4] . One of the keys to the API’s success is that it drives a large percentage of backend testing and has aided incremental development.  Testing a website is often hard and labor intensive, however by testing the site with the API  Salesforce.com has been able to automate much of the testing of the platform.</p>

<p><strong>Using the API</strong><br />
This section describes the main features of the API and gives examples in Java of how to invoke and use the Salesforce application through the API. Other examples can be found at the sforce developer site [2].  These examples were built using Axis 1.2 and JDK 1.5 using the enterprise WSDL from a test organization on the Winter 06 release.<br />
The API provides a SOAP/WSDL interface that allows people to create, modify and delete objects using XML over HTTP.  It allows programs to search using SOSL (Salesforce Object Search Language) and query using SOQL (a SQL like query language, Salesforce Object Query Language).  The main verbs are retrieve, create,  update, query and delete.</p>

<p><strong>Security</strong><br />
Access to the data exposed by the API is governed by the permissions and security options available in the application.  All interactions with the service are encrypted using SSL.     Client applications must log in using valid credentials for a Salesforce account. The Sforce server authenticates these credentials and, if valid, provides the client application with: <br />
•	A sessionID that must be set into the session header so that all subsequent API calls are authenticated<br />
•	A URL for the Sforce Web service that will service the client application's Web service requests</p>

<p><strong>Service Description</strong><br />
A service is described using either the Partner WSDL or the Enterprise WSDL.  The Partner WSDL is generic and applies to all services, describing the operations and generic data objects that exist in the Salesforce application.  The Enterprise WSDL is generated per organization and includes XML Schema descriptions of custom objects.</p>

<p><strong>Getting Started</strong><br />
Inside the Salesforce.com application go to Setup → Integrate → WSDL Generator → Download Enterprise WSDL.  Download the WSDL and use your favorite WSDL compiler to generate client code.<br />
Login<br />
The following code illustrates how to login into the API.  You will have to use a valid salesforce account and replace <login> and <password> with your credentials.  You can sign up for a developer edition account for free so it’s very easy to try out the service and test code against the API.</p>

<pre>
	// Make a service
	SforceService service = new SforceServiceLocator();

<p>	// Now use the service to get a stub which implements the SDI.<br />
	SoapBindingStub port = (SoapBindingStub) service.getSoap();<br />
	<br />
	LoginResult loginResult=null;<br />
	int loginCount=0;<br />
	while(loginCount <= 3) {<br />
	    try {<br />
		loginResult =  port.login(<username>,<password>);<br />
		break;<br />
	    } catch (com.sforce.soap.enterprise.fault.LoginFault lf) {<br />
		throw lf;<br />
	    } catch (RemoteException e) {<br />
		if (loginCount >= 3) {<br />
		    throw new Exception("Unable to login to Salesforce after "+loginCount+<br />
                                       " tries\n Underlying exception=["+e.getMessage()+"]");<br />
		}<br />
		loginCount++;<br />
	    }<br />
	}<br />
</pre></p>

<p>The above code manages logging into the API.  The login call returns an endpoint and a session header that needs to be included on all subsequent API calls in the current session.<br />
<pre><br />
	port._setProperty(SoapBindingStub.ENDPOINT_ADDRESS_PROPERTY, <br />
			  loginResult.getServerUrl());</p>

<p>	SessionHeader sh = new SessionHeader(); <br />
	sh.setSessionId(loginResult.getSessionId()); <br />
 <br />
	//set the session header for subsequent call authentication <br />
	port.setHeader(service.getServiceName().getNamespaceURI(), "SessionHeader", sh); <br />
	// Make the actual call<br />
	System.out.println("URL:"+loginResult.getServerUrl()+<br />
                           " Invoked timestamp is:"<br />
                           +port.getServerTimestamp().getTimestamp());<br />
</pre><br />
<strong>Query</strong><br />
The following query illustrates how to get information out of the API using SOQL and a cursor across a result set.</p>

<pre>
	QueryResult qr = null;
	try {
	    qr = port.query("select firstname,lastname from contact");
	    boolean done = false;
	    if (qr.getSize() > 0){
		System.out.println("Logged in user can see " + 
qr.getRecords().length + " contact records.");
		System.out.println("FirstName\tLastName");
		while (!done) {
		    for (int i=0;i<qr.getRecords().length;i++) {
			Contact contact = (Contact) qr.getRecords(i);
			System.out.println(contact.getFirstName()+"\t"+contact.getLastName());
		    }
		    if (qr.isDone()) {
			done = true;
		    } else {
			qr = port.queryMore(qr.getQueryLocator());
		    }
		}
	    } else {
		System.out.println("No records found.");
	    }
	    System.out.println("\nQuery succesfully executed.");
	} catch (RemoteException ex) {
	    System.out.println("\nFailed to execute query succesfully:"+ex
+"\n, error message was: \n" + ex.getMessage());
	}
</pre>

<p><strong>Insert and Update</strong><br />
The following code shows how to create and insert a new Account object into the system.<br />
<pre><br />
    Account account1 = new Account(); <br />
    account1.setAccountNumber("002DF99ELK9"); <br />
    account1.setName("Acme International");<br />
    account1.setBillingCity("Wichita"); <br />
    account1.setBillingCountry("US"); <br />
    account1.setBillingState("KA"); <br />
    account1.setBillingStreet("4322 Haystack Boulevard"); <br />
    account1.setBillingPostalCode("87901"); <br />
    SObject[] sObjects = new SObject[1]; <br />
    sObjects[0] = account1; <br />
    SaveResult[] saveResults = port.create(sObjects); <br />
  <br />
    for (int i=0;i<saveResults.length;i++) { <br />
      // Determine whether create succeeded or had errors <br />
      if (saveResults[i].isSuccess()) { <br />
         // No errors, so we will retrieve the id created for this index <br />
         System.out.println(saveResults[i].getId()); <br />
      }<br />
      else { <br />
	  System.out.println("error:"+<br />
              saveResults[i].getErrors()[0].getMessage());<br />
         // Handle the errors <br />
      }<br />
    }</p>

</pre>

<p>The following code shows how to update an object given its ID.</p>

<pre>
   SObject[] updates = new SObject[1]; 
 
   Account updateAccount = new Account(); 
   updateAccount.setId(id);
   updateAccount.setName("New Account Name from Update Sample"); 
   updates[0] = updateAccount; 
 
  
   SaveResult[] updateResults = port.update(updates);
</pre>
<strong>More resources </strong> 
More resources can be found at <a href="http://www.sforce.com">http://www.sforce.com</a> , including comprehensive API documentation and support forums for developers.

<p><strong>Looking Forward</strong><br />
This section describes some of the features of the API that may be coming in future versions of the Salesforce.com platform.  These statements are forward looking and may or may not reflect future versions of the Salesforce.com API.</p>

<p>•	Relationships<br />
•	Reliable Messaging<br />
•	Outbound calls<br />
•	MetaData API<br />
•	Single Sign On for Web Services</p>

<p>Relationships allow users to query across a set of objects and their relationships.  This is a much requested feature in the API and allows a single query to simulate joining against various backend object relationships.  Currently client code is required to do the join on the client by executing multiple queries and matching on the ID’s of the objects.</p>

<p>Reliable outbound messaging represents a way for client applications to be notified when information changes rather than having to poll the application for state changes.</p>

<p>Finally, a MetaData API allows consumers and producers of applications built on the AppForce platform to automatically export application metadata and to write programs that automatically install and configure applications.</p>

<p><strong>What does this mean for Web Services?  </strong></p>

<p>Salesforce is at the forefront of Web Service technology.  It drives the core of its business using SOAP and WSDL.  Many people suggest that Web Services need time to mature however salesforce.com has shown that using simple design principles you can build your business on Web Services today and don’t need to wait for WS-* to get things done.</p>

<p>Currently Web Services enable wide scale integration for hosted services platforms.  As more and more software moves to the on-demand model Web Services will provide the protocols that let companies and individuals access their data.  The current set of Web Service technologies are enough to make progress today and build successful integrations.  As these integrations are built out they will drive standards around sessions, reliable messaging, asynchronous messaging and usable security models.</p>

<p>References<br />
[1] <a href="http://www.acmqueue.com/modules.php?name=Content&pa=showpage&pid=320">Dean Jacobs, Enterprise Software as a Service, ACM Queue vol. 3, no. 6 - July/August 2005</a><br />
[2] <a href="http://www.sforce.com">http://www.sforce.com</a><br />
[3] <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm">http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm</a><br />
[4] <a href="http://salesforce.breezecentral.com/intelligentreaction/">http://salesforce.breezecentral.com/intelligentreaction/</a><br />
</p>]]>
</content>
</entry>
<entry>
<title>Software as a service by Dean</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2005/09/software_as_a_s.html" />
<modified>2005-09-26T22:03:19Z</modified>
<issued>2005-09-26T22:02:24Z</issued>
<id>tag:www.cfry.net,2005:/blog/spikes//2.52</id>
<created>2005-09-26T22:02:24Z</created>
<summary type="text/plain">Dean talks about software as a service....</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>Dean talks about <a href="http://www.acmqueue.org/modules.php?name=Content&pa=showpage&pid=320">software as a service</a>.</p>]]>

</content>
</entry>
<entry>
<title>Desktop widgets</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2005/07/desktop_widgets.html" />
<modified>2005-09-21T10:08:56Z</modified>
<issued>2005-07-26T23:10:39Z</issued>
<id>tag:www.cfry.net,2005:/blog/spikes//2.39</id>
<created>2005-07-26T23:10:39Z</created>
<summary type="text/plain">Konfabulator was just acquired by Yahoo! to drive adoption of their web services platform. The logic is that widgets drive use of their API with a lower bar to entry....</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p><a href="http://www.konfabulator.com/">Konfabulator</a> was just acquired by Yahoo! to drive adoption of their web services platform.  The logic is that widgets drive use of their API with a lower bar to entry.</p>]]>

</content>
</entry>
<entry>
<title>Hosted versus shipping software</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2005/06/hosted_versus_s.html" />
<modified>2005-06-28T21:21:42Z</modified>
<issued>2005-06-28T21:19:01Z</issued>
<id>tag:www.cfry.net,2005:/blog/spikes//2.36</id>
<created>2005-06-28T21:19:01Z</created>
<summary type="text/plain">So I started my Salesforce.com job. Some of my initial impressions are that writing hosted software requires a slightly different mindset than writing packaged software. You need to be a master of all the security requirements of your customers and...</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>So I started my Salesforce.com job.  Some of my initial impressions are that writing hosted software requires a slightly different mindset than writing packaged software.  You need to be a master of all the security requirements of your customers and keeping the site running becomes part of the organizational know how.  </p>

<p>More impressions later...</p>]]>

</content>
</entry>
<entry>
<title>A replacement for WSDL?</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2005/05/a_replacement_f.html" />
<modified>2005-09-21T10:08:56Z</modified>
<issued>2005-05-04T22:19:13Z</issued>
<id>tag:www.cfry.net,2005:/blog/spikes//2.33</id>
<created>2005-05-04T22:19:13Z</created>
<summary type="text/plain">Here is an interesting proposal for WSDL replacement: SMEX-D ....</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>Here is an interesting proposal for WSDL replacement: <a href="http://www.tbray.org/ongoing/When/200x/2005/05/03/SMEX-D">SMEX-D</a> .</p>]]>

</content>
</entry>
<entry>
<title>Extensible Services</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2004/10/extensible_serv.html" />
<modified>2005-09-21T10:08:56Z</modified>
<issued>2004-10-29T21:36:14Z</issued>
<id>tag:www.cfry.net,2004:/blog/spikes//2.27</id>
<created>2004-10-29T21:36:14Z</created>
<summary type="text/plain">One of the areas I&apos;ve been getting interested in lately is around creating extensible web services. Dave O has a nice post at xml.com on the topic....</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>One of the areas I've been getting interested in lately is around creating extensible web services.  <a href="http://www.pacificspirit.com/blog/">Dave O</a> has a nice post at xml.com on the <a href="http://www.xml.com/pub/a/2004/10/27/extend.html">topic</a>.</p>]]>

</content>
</entry>
<entry>
<title>Overview of WSDL 2.0</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2004/10/overview_of_wsd.html" />
<modified>2005-09-21T10:08:56Z</modified>
<issued>2004-10-18T20:46:18Z</issued>
<id>tag:www.cfry.net,2004:/blog/spikes//2.26</id>
<created>2004-10-18T20:46:18Z</created>
<summary type="text/plain">A nice overview of the WSDL 2.0 spec can be found here . Some of the confusing terminology of the WSDL 1.1 spec has been clarified (Ports are now endpoints and PortTypes are now interfaces). The message element has been...</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>A nice overview of the WSDL 2.0 spec can be found <a href="http://www.xml.com/lpt/a/ws/2004/05/19/wsdl2.html">here </a>.  Some of the confusing terminology of the WSDL 1.1 spec has been clarified (Ports are now endpoints and PortTypes are now interfaces).  <br />
The message element has been moved into the XML Schema section.  <br />
We'll see how much support it starts to garner...</p>]]>

</content>
</entry>
<entry>
<title>Are interfaces necessary for web services?</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2004/10/are_interfaces.html" />
<modified>2005-09-21T10:08:56Z</modified>
<issued>2004-10-08T00:31:35Z</issued>
<id>tag:www.cfry.net,2004:/blog/spikes//2.21</id>
<created>2004-10-08T00:31:35Z</created>
<summary type="text/plain">So last night Pete, John and I went over to check out Technorati&apos;s web service offering at their hackathon. One interesting question that came up for me is, &quot;are interfaces necessary for web services.&quot; If you take a look at...</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>So last night Pete, John and I went over to check out Technorati's web service offering at their <a href="http://www.sifry.com/alerts/archives/000386.html">hackathon</a>.  One interesting question that came up for me is, "are interfaces necessary for web services."  If you take a look at technorati's offering of queries they essentially paramatrize a url and then return an xml document.  This is a very straightforward way to query their data.  However they don't expose any WSDL (or even SOAP).  Does that matter?  I think for a v 1.0 service it doesn't.  Maybe you need a little more documentation to get your service off the ground, and you can't use any generic client tools like .NET or JAX-RPC, to work with it.  This could limit your user base.  In practice, for popular services it doesn't seem to limit your popularity because nice developers tend to write language specific bindings for your service in Python, Perl, Java etc.   This seems like an easy quick way for sites to get off the ground providing a broad set of query methods.</p>

<p>There are some drawbacks however to not having a WSDL and to not using SOAP.  (1) You are bound to HTTP; (2) If you version the contract how do you notify your clients? (3) Related to 1, no SOAP Headers; (4) No public contract other than your documentation.<br />
 </p>]]>

</content>
</entry>
<entry>
<title>WebServices heating up</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2004/10/webservices_hea.html" />
<modified>2005-09-21T10:08:56Z</modified>
<issued>2004-10-06T05:37:49Z</issued>
<id>tag:www.cfry.net,2004:/blog/spikes//2.20</id>
<created>2004-10-06T05:37:49Z</created>
<summary type="text/plain">So It feels like web services are heating up. Google and Amazon have long standing web service APIs that get plenty of use. Here is a link to amazon&apos;s offering: http://www.amazon.com/gp/browse.html/102-4902219-4008929?node=3435361 Sites like AllConsuming are integrating these sites. Many startups...</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>So It feels like web services are heating up.  Google and Amazon have long standing web service APIs that get plenty of use.   Here is a link to amazon's offering:</p>

<p>http://www.amazon.com/gp/browse.html/102-4902219-4008929?node=3435361</p>

<p>Sites like <a href="http://www.allconsuming.net/">AllConsuming </a> are integrating these sites.</p>

<p>Many startups have a WSDL/SOAP or RESTful API as a matter of course:</p>

<p>See <a href="http://developers.technorati.com/wiki">technorati</a></p>

<p>and </p>

<p><a href="http://www.flickr.com/services/api/">Flikr</a>.</p>

<p>It's not clear how much of the WS-* specs are being used here, but web services are clearly becoming the programmatic api to the web.</p>]]>

</content>
</entry>
<entry>
<title>Loose coupling</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2004/09/loose_coupling.html" />
<modified>2005-09-21T10:08:56Z</modified>
<issued>2004-09-16T18:37:46Z</issued>
<id>tag:www.cfry.net,2004:/blog/spikes//2.18</id>
<created>2004-09-16T18:37:46Z</created>
<summary type="text/plain">For all the talk of loose coupling I&apos;m surprised how tightly coupled WebServices have become. I think there is room for a completely interpreted stack that does no binding to the java types but enforces XMLSchema constraints and SOAP QOS...</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>For all the talk of loose coupling I'm surprised how tightly coupled WebServices have become.  I think there is room for a completely interpreted stack that does no binding to the java types but enforces XMLSchema constraints and SOAP QOS for reliability, security and routing.   It would be cool to implement this in python or perl and insert it as an adaptive layer between the world and the application.  </p>]]>

</content>
</entry>
<entry>
<title>Data Binding in Web Services</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2004/08/data_binding_in.html" />
<modified>2005-09-21T10:06:58Z</modified>
<issued>2004-08-28T05:45:59Z</issued>
<id>tag:www.cfry.net,2004:/blog/spikes//2.9</id>
<created>2004-08-28T05:45:59Z</created>
<summary type="text/plain">Often when using webservices you are confronted with a decision on how to bind the XML Schema you have into java. If you are starting with a WSDL you can either bind each complex type to a DOM or to...</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>Often when using webservices you are confronted with a decision on how to bind the XML Schema you have into java.  If you are starting with a WSDL you can either bind each complex type to a DOM or to a generated java class.  Each method has its advantages and disadvantages.  Fine-grained binding into java is nice if you are going to use each data type in the application, are satisfied with the default binding and are planning on writing a lot of java centric logic.  Use DOM when you want to delegate to a different binding solution (say JAXB rather than using JAXB types) or you want to only use standard XML tools on the data types.  </p>

<p>For example your method signature could be<br />
<pre><br />
   Foo echo(Foo complexObj);<br />
</pre> or <br />
<pre><br />
   DOM echo (DOM complexXML);<br />
</pre></p>

<p>Don Box has made the point that probably web service engines like Indigo should be in the business of routing, reliability and security and be out of the business of data binding.  At first I thought this was wrong but then I realized it was a really nice factoring of the plumbing with the data types.  Let the WebService engines deal with the messages and then delegate the type resolution and binding to a later stage.  </p>]]>

</content>
</entry>
<entry>
<title>What&apos;s new in the next version of WebLogic WebServices?</title>
<link rel="alternate" type="text/html" href="http://www.cfry.net/blog/spikes/archives/2004/08/whats_new_in_th.html" />
<modified>2005-09-21T10:08:56Z</modified>
<issued>2004-08-26T04:11:33Z</issued>
<id>tag:www.cfry.net,2004:/blog/spikes//2.6</id>
<created>2004-08-26T04:11:33Z</created>
<summary type="text/plain">An interview I did for dev2dev....</summary>
<author>
<name>Chris</name>
<url>http://cfry.net</url>
<email>social@cfry.net</email>
</author>
<dc:subject>WebServices</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.cfry.net/blog/spikes/">
<![CDATA[<p>An <a href="http://dev2dev.bea.com/trainingevents/dev2devlive/chrisfry.jsp">interview </a>I did for dev2dev.</p>]]>

</content>
</entry>

</feed>