OpenSocial? API support

APIs supported

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.

Authentication

The authentication is compatible with GBase ClientLogin username/password authentication.

REST API details

  • URI: http://<cname>:<port>/feeds/login

Parameters

  • Uname - the ODS user account
  • Passwd - password

Return

  • On success it will return:

    auth=NNNN

    where NNNN... is a security token and it matches a SID for login to ODS.
  • If authentication fails it will return:

    Error=BadAuthentication

Sample session


$ 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

People API

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.

Sample Session

Person data


$ 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>

Friends


$ 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>

Activities API

The activities API is implemented as described in http://code.google.com/apis/opensocial/docs/gdata/activities/developers_guide_protocol.html

Creating entries

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>

Retrieving entries

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

Updating entries

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>

Deleting entries

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 CategoryWebSite