The ODS package contains OpenSocial data APIs about people and activities. Also it implements a login compatible with GBase which can be used to perform OpenSocial API calls requiring authentication. The implementation code is located in the opensocial.sql file from the ods package.
The authentication is compatible with GBase ClientLogin username/password authentication.
auth=NNNN
Error=BadAuthentication
$ curl -i "http://localhost/feeds/login?Uname=test&Passwd=secret" HTTP/1.1 200 OK Server: Virtuoso/05.00.3021 (Linux) i686-pc-linux-gnu VDB Connection: Keep-Alive Date: Wed, 14 Nov 2007 16:44:42 GMT Accept-Ranges: bytes Content-Type: text/plain; charset="ISO-8859-1" Content-Length: 38 auth=f305177cb1d9fbf409579250e944e980
The people API is implemented as described in http://code.google.com/apis/opensocial/docs/gdata/people/developers_guide_protocol.html The only difference is that personID is not a number but ODS user account.
$ curl -i "http://localhost:8890/feeds/people/demo" HTTP/1.1 200 OK Server: Virtuoso/05.00.3021 (Linux) i686-pc-linux-gnu VDB Connection: Keep-Alive Date: Wed, 14 Nov 2007 16:49:27 GMT Accept-Ranges: bytes Content-Type: application/atom+xml; charset="ISO-8859-1" Content-Length: 1018 <entry xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005"> <id>http://localhost:8890/feeds/people/demo</id> <updated>2007-11-01T10:55:33.000+02:00</updated> <title>demo demo</title> <link rel="thumbnail" type="image/*" href="/DAV/home/demo/wa/images/me_avt.jpg"/> <link rel="alternate" type="text/html" href="http://localhost:8890/dataspace/person/demo"/> <link rel="self" type="application/atom+xml" href="http://localhost:8890/feeds/people/demo"/> <georss:where> <gml:Point xmlns:gml="http://www.opengis.net/gml"> <gml:pos>43.000000 25.000000</gml:pos> </gml:Point> </georss:where> <gd:extendedProperty name="lang" value="en-US"/> <gd:postalAddress label="Home"><![CDATA[ str. 123 apt. 45 New York USA ]]></gd:postalAddress> <gd:postalAddress label="Work"><![CDATA[ ]]></gd:postalAddress> <gd:phoneNumber label="Private" rel="http://schemas.google.com/g/2005#mobile">+359887563204</gd:phoneNumber> </entry>
$ curl -i "http://localhost:8890/feeds/people/demo/friends" HTTP/1.1 200 OK Server: Virtuoso/05.00.3021 (Linux) i686-pc-linux-gnu VDB Connection: Keep-Alive Date: Wed, 14 Nov 2007 16:50:14 GMT Accept-Ranges: bytes Content-Type: application/atom+xml; charset="ISO-8859-1" Content-Length: 2104 <feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005"> <id>http://localhost:8890/feeds/people/demo/friends</id> <updated>2007-11-14T18:50:14.000+02:00</updated> <title>demo's Friends</title> <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://localhost:8890/feeds/people/demo/friends"/> <link rel="self" type="application/atom+xml" href="http://localhost:8890/feeds/people/demo/friends"/> <author><name>demo</name></author> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005"> <id>http://localhost:8890/feeds/people/dav</id> <updated>2007-11-01T10:33:10.000+02:00</updated> <title>WebDAV System Administrator</title> <link rel="alternate" type="text/html" href="http://localhost:8890/dataspace/person/dav"/> <link rel="self" type="application/atom+xml" href="http://localhost:8890/feeds/people/dav"/> <georss:where> <gml:Point xmlns:gml="http://www.opengis.net/gml"> </gml:Point> </georss:where> <gd:extendedProperty name="lang" value="en-US"/> <gd:postalAddress label="Home"><![CDATA[ ]]></gd:postalAddress> <gd:postalAddress label="Work"><![CDATA[ ]]></gd:postalAddress> </entry> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005"> <id>http://localhost:8890/feeds/people/alice</id> <updated>2007-11-02T18:01:04.000+02:00</updated> <title>alice</title> <link rel="alternate" type="text/html" href="http://localhost:8890/dataspace/person/alice"/> <link rel="self" type="application/atom+xml" href="http://localhost:8890/feeds/people/alice"/> <georss:where> <gml:Point xmlns:gml="http://www.opengis.net/gml"> </gml:Point> </georss:where> <gd:extendedProperty name="lang" value="en-US"/> <gd:postalAddress label="Home"><![CDATA[ (Private Address), ]]></gd:postalAddress> <gd:postalAddress label="Work"><![CDATA[ ]]></gd:postalAddress> </entry> </feed>
The activities API is implemented as described in http://code.google.com/apis/opensocial/docs/gdata/activities/developers_guide_protocol.html
To create a new entry client must be authenticated first, then it issue a POST request to the activities feed an Atom based xml representation like :
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom"> <atom:updated>2007-10-29T19:00:51.574Z</atom:updated> <atom:category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/activities/2007#activities"/> <atom:title>I'm at work</atom:title> </atom:entry>
The server will respond with entry containing atom:id element, below is a simple session for creating a new entry. The "ODS Auth" value is the sid value for the logged in user demo in ODS.
curl -i -d "`cat act.xml`" -H "Authorization: ODS Auth=032a81d688a275910bd5ef31aff6d5ab" -H "Content-Type: application/atom+xml" "http://localhost:8890/activities/feeds/activities/user/demo/source/0" HTTP/1.1 201 Created Server: Virtuoso/05.00.3021 (Linux) i686-pc-linux-gnu VDB Connection: Keep-Alive Date: Thu, 15 Nov 2007 12:25:10 GMT Accept-Ranges: bytes Content-Type: application/atom+xml; charset="ISO-8859-1" Content-Length: 636 <entry xmlns="http://www.w3.org/2005/Atom"> <id>http://localhost:8890/activities/feeds/activities/user/demo/source/0/10</id> <updated>2007-11-15T14:25:10.000+02:00</updated> <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/activities/2007#activity"/> <title>I'm at work</title> <link rel="self" type="application/atom+xml" href="http://localhost:8890/activities/feeds/activities/user/demo/source/0/10"/> <link rel="edit" type="application/atom+xml" href="http://localhost:8890/activities/feeds/activities/user/demo/source/0/10"/> <received>2007-11-15T14:25:10.000+02:00</received> </entry>
The feed retrieval is just a GET against user activities feed, e.g.,
GET http://localhost:8890/activities/feeds/activities/user/demo
produces a Atom feed with users activities listed
The update is similar to entry creation, but in this case the HTTP method must be PUT and the Atom entry must contain a valid atom:id, for example:
<?xml version="1.0"?> <entry xmlns="http://www.w3.org/2005/Atom"> <id>http://localhost:8890/activities/feeds/activities/user/demo/source/12/8</id> <updated>2007-10-27T19:41:51.574Z</updated> <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/activities/2007#activity"/> <title>Another Edited title</title> <link rel="self" type="application/atom+xml" href="http://www.google.com/activities/feeds/activities/user/userID/source/sourceID/a1"/> <link rel="edit" type="application/atom+xml" href="http://www.google.com/activities/feeds/activities/user/userID/source/sourceID/a1"/> <received>2007-10-27T19:41:51.478Z</received> </entry>
It's the same as update, just in this case the HTTP method is DELETE.
In cases where clients do not support PUT/DELETE , the X-HTTP-Method-Override HTTP header is supported; i.e., DELETE can be represented by :
POST /url HTTP/1.1 X-HTTP-Method-Override: DELETE ....
CategoryODS CategoryVirtuoso CategoryOpenSocial? CategoryWebSite