June 30, 2008
The Fundamental Mysteries of OpenURL
My colleague Andrew Houghton and I have been comparing notes lately and have come to some surprising realizations. Below are three mysteries that everyone who loves and/or hates OpenURL (not to mention the unwashed masses who have never even heard of it) should ponder deeply:
Believe it or not, everything is a resource. I mean everything. The set of resources identified by URIs is merely an infinitesimal subset. Furthermore, every single URI that gets minted implies a unique resource. Even for a single resource (e.g. an image of a dog), the set of possible URIs (and thus implied unique resources) could easily stretch out to infinity (e.g. by appending a query string with a floating point rotation value).
Since OpenURLs are ultimately URIs, each of these likewise implies a unique resource. Confronted with a potentially infinite variety of OpenURLs, most Requesters will have no hope of recognizing that a single resource (aka Referent) stands behind them all. If this doesn't bother you, it should. Stay tuned for the solution...
I have long wondered why OpenURL doesn't require at least one ServiceType Entity the way it requires a Referent Entity. At the very least, why not mention the option of an implied default ServiceType? After all, Requesters are going to expect some non-random task to be performed when they resolve an OpenURL.
Suddenly, this makes perfect sense to me. An OpenURL can be understood by any agent (and not just those that are OpenURL-aware) to be a protocol-based absolute or relative URI for a web resource. In HTTP terms, the common operations performed on resources are POST, GET, PUT, and DELETE. Note that these operations are commonly referred to as Create, Read, Update, and Delete (CRUD). It would be odd and unnecessary to construct an OpenURL with a create, read, update, or delete ServiceType Descriptor that gets invoked via HTTP GET. This would amount to "tunneling" operations over HTTP that HTTP can perform natively. Even a search operation boils down to an HTTP GET operation on a resource URI. After all, a search service is "something" and, as argued above, "Everything is a Resource". HTTP GET is just the right operation to make it return a useful response.
Any belief that OpenURL supports operations other than CRUD betrays an OpenURL-bias that the non-OpenURL world will never buy into. If this bothers you (and it should), try to imagine instead that it is a good thing. Stay tuned for the solution...
Q6 "Binds" Resources and CRUD Operations
Since "Everything is a Resource", and "All Operations are CRUD", where does OpenURL fit in and what are its limits? The answers lie hidden in the OpenURL domain model. Stay tuned to find out who, what, where, why, when, and how...
Implications
These three principles can be applied to everything that happens on the Internet (and far beyond). For example, random agents can understand SOAP to be a set of CRUD operations on resources that are tunneled to a SOAP service resource via HTTP POST. A demonstration of this will have to wait, though. OpenURL already lies closer to the truth, so we'll start there...
Jeffrey A. Young
Andrew Houghton
4 comments so far
I'll wait for the more, but I'm dubious already.
Most existing SAP1/2 OpenURLs do provide a number of services, in varying combinations, that are not obviously bounded by "CRUD". Ones we can think of include: Show full text; show holdings; make ILL or other document delivery request; show similar items; show abstracts; show subjects. If you suggest that it doesn't make sense for a link resolver to actually allow a client to specify which of these they want, but limits them to saying an unspecified "GET"... it's going to be a hard sell to me.
Jeff --
You just described the principles of the Web Architecture (http://www.w3.org/TR/webarch/) and RESTful Web Services (http://oreilly.com/catalog/9780596529260/). It is a very powerful notion. The RESTful Web Services book describes the "tunneling" as a flavor of RPC commonly found in SOAP-based services. So I'm with you 100% already.
John --
The services you describe can be put in terms of CRUD: "show full text" and "show holdings" (both are Read, distinguished by constructs in the base URI or in the query string); "make ILL request" (Create, as in a new transaction).
I've followed the link you've left on Tim Bray's blog and I discovered OpenURL. Now I'm curious, I've quickly skimmed through the Wikipedia article about OpenURL as well as your articles and I haven't really understood the why? It's a lot of technical stuff but I have no idea why I'd want to use it. Also I've found the name to be really confusing "OpenURL"? What's so open about it? :)
Sylvain, I'll try to answer this in my next blog entry.