W3C home > Mailing lists > Public > www-tag@w3.org > April 2002

Re: FW: draft findings on Unsafe Methods (whenToUseGet-7)

From: Paul Prescod <paul@prescod.net>
Date: Tue, 23 Apr 2002 12:04:18 -0700
Message-ID: <3CC5B032.481EF1DE@prescod.net>
To: Anne Thomas Manes <anne@manes.net>
CC: www-tag@w3.org, www-ws-arch@w3.org, xml-dist-app@w3.org
Anne Thomas Manes wrote:
> 
> Paul Prescod wrote:
> >
> > We're getting off into a diversion. Can we agree that every piece of
> > information available on the Web should be URL addressable or a PART of
> > a URL-addressable resource? And I don't mean part in a vague sense: I
> > mean you download a representation and the piece of information is in
> > there. In many content-types you can also directly link to
> > "sub-resources" of the resource (e.g. XML, PowerPoint, PDF)
> >
> 
> Agreed. In the case of a Web service, if you perform a simple GET on the
> resource, you receive a service description, which tells you how to (a) how
> to invoke the service or (b) how to send a message to the service.

Let's be concrete. With the HTTP version of Google' web service I can
refer to any cached page with a URI:

 * http://216.239.35.100/search?q=cache:www.manes.net

With the SOAP version *I cannot do so*. Cached pages retrieved through
the SOAP interface *have no URI*. If the SOAP interface is removed, the
URI version provides all of the same functionality. But if the URI
version is removed I can no longer use XPath/XPointer/XSLT's "document"
function to retrieve this. I can no longer use XInclude to refer to it.
I can no longer use a cached Google document as an XML Namespace
definition. I can no longer make RDF assertions about it.

The HTTP-GET version of the service is in a very strict, concrete sense,
more powerful than the HTTP-POST/SOAP version.

The same goes for UDDI. Please forget that UDDI is about discovery. I'm
not talking about the best way to do discovery. I'm talking about the
best way to make a bunch of information available on the Web. UDDI
repositories happen to be a "bunch of information." For all I care it
could be a rap album database. An HTTP-GET/PUT/POST/DELETE version of
UDDI, or the rap database, would be more powerful in a strict and
concrete sense then the HTTP-POST/SOAP version. Thousands of people have
heard this claim and not one has disputed it.

I could go down the list of web services at XMethods and demonstrate the
same thing. Each can be made demonstrably and substantially more
powerful if you base them on multiple HTTP methods rather than just one.
It doesn't matter whether the service is read-only or read-write, the
multiple-method HTTP version still wins. Thousands of people have heard
this claim and I am waiting for the first counter-example.

>....
> I encourage you to explore new ways to perform discovery. 

I think we could have a very interesting conversation about this but I
don't think it is the same conversation as whether SOAP should support
more than one HTTP method.

>...
> Right now the most popular form of discovery of Web resources by humans is
> Google, although Google doesn't particular help you discover Web services (a
> very specialized form of Web resource). Google (until now) hasn't been
> particularly available to application (non-human)clients. By building a SOAP
> API to Google, applications can now invoke Google searches. I would
> characterize the Google SOAP API as extremely flexible and powerful -- so
> I'm having trouble following your argument. Are you saying that it could be
> more flexible and powerful (i.e., support simpler discovery) if Google
> designed a API based on something else other than SOAP?

Yes, I will separately send you an article that demonstrates this. 

> If you spend a moment looking at the Google WSDL description, you'll realize
> that the input and output messages are relatively complex. 

Just FYI, I've done more than look at the Google WSDL description. I
rewrote it to use pure HTTP. (WSDL supports "pure" HTTP) I also wrote a
server side application that maps from the HTTP version to the SOAP
version. My version is a strict functional superset of the real Google
version.

The other fascinating thing about it is that Google has three methods.

 1. GetCachedPage. They *already* have an HTTP way to do this. They
merely needed to descsribe it in WSDL and it would have been an official
web service. For various reasons the HTTP version would be substantially
more efficient and simpler.

 2. SpellingCorrection. this one takes one string argument and returns
one string argument. In order to do that, it builds two HTTP envelopes
and two SOAP envelopes, although HTTP can trivially pass strings back
and forth.

 3. GoogleSearch. This one was provided in a XML/HTTP version around a
year ago. That service became pay-only.

So they had their problem essentially solved a year ago and they had
only to publish a WSDL. But instead they invented a less powerful, less
efficient SOAP wrapper. That's progress!

> ... The data are
> structured and typed, and the formats change based on the function you're
> performing. From a developer's point of view, it much simpler to deal with
> these input and output messages as application structures than as URI
> constructs. I'm not sure that I'm willing to sacrifice developer
> productivity for a simpler discovery mechanism. 

There is no change in developer productivity. If you are using the .NET
framework you take my version of the wsdl and you say:

delete GoogleSearch.wsdl
ren Pauls.wsdl GoogleSearch.wsdl
wsdl Pauls.wsdl

That generates a C# class which is identical to C# or VB programmers
(actually there is a bug in Microsoft's WSDL implementation that
prevents this from being strictly true -- but it is very close). If
other WSDL implementations are similarly sophisticated (they aren't,
yet) then the same will be true for them. I'm not theorizing. I have the
code to prove it:

wsdl: 
	http://www.prescod.net/rest/googleapi/GoogleHTTP.wsdl
generated C# client (after a small bug fix): 
	http://www.prescod.net/rest/PureXMLGoogleHTTPService.cs
C# client code (same as shipped with the Google API): 
	http://www.prescod.net/rest/googleapi/Form1.cs
server implementation: 
	http://www.prescod.net/rest/googleapi/google_gateway.zip

To be clear, the only thing that changed for the average developer is
the classname. For clarity I created a different class name than
Google's. But now the underlying service is based on GET (they had no
need of PUT/POST/DELETE) and supports URI referencing.

>...
> 
> Since Web services by definition are identified by a URI, you can easily
> reference a Web service. Our are you looking for more granularity -- I
> imagine that you're asking for a mechanism to supply a URI that provides
> access to a specific method within the service?
> There are ways to do so. You could provide a reference to a specific QName
> (referencing an operation within a portType) within the WSDL document.

I don't want to reference the web service. I want to reference the
information WITHIN the web service. If it is a stock database, I want to
reference *individual* stock quotes. If it is a UDDI repository then I
want to reference individual T-Models. If it is a Google search then I
want to reference individual search results (as I could a year ago, but
cannot with the SOAP API). If it is an album database I want to
reference individual albums.

This is not rocket science. It works on the Web as we know it. We now
have a trend of people choosing to use SOAP because it is new and shiny
and losing features that the Web provided them in 1993. We need to
figure out how SOAP can add value to the Web's existing features and not
detract or compete with them.

 Paul Prescod
Received on Tuesday, 23 April 2002 15:03:59 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Thursday, 26 April 2012 12:47:06 GMT