Interfacing to Anymeta
custom applications vs. webbrowsers
Historically, online communities were formed using dedicated communication protocols which required specific client software. With the web evolving, web-browsers can fully emulate this functionality and social online networks have been exploding ever since. Although web-browsers offer a flexible user interface, they are limited by the traditional screen/keyboard/mouse and provide only limited automation mechanisms. To automate actions on web sites, APIs have been called into existence.
The Anymeta CMS exposes a rich web API (Application Programmer's Interface) to access the semantic data stored within its CMS. Some are very simple, some very advanced. Some are customized for installations and all are based on open standards, aiming towards data portability and focusing on interoperability.
Concept and background information
Basically Anymeta allows you to store, retrieve and modify data with the following constraints:
- Traffic is sent via HTTP requests.
- Querying information is subjected to access control, both for web-browser and bot.
- Access can be obtained by signing your request with OAuth.
- Data retrieval operations are should use the GET method
- Data modification operations must use the POST method
- You need choose a format (eg. HTML, JPEG, XML, JSON) to represent the thing(s).
Anymeta API overview
in Anymeta everything is a thing; meaning every person, article, object, role, attribute, etc is represented as a thing with an unique reference-handle (numeric ID or URL). Things can be connected by edges (links). Each of these edges consists of a predicate (eg "author of") and optionally attributes (eg. "language") linking a source object to a destination object. Both predicate and attributes are things themselves. - example : "John Doe" "is the author of " "article Foo" .
Every thing is reference by it's ID. There is a search function to lookup IDs by title and most functions allow to specify a symbolic name as a convenient shortcut (predicates like "author of" might be represented by different IDs or URIs on different systems and would require additional lookups beforehand). Custom modules allow to search RFIDs or perform more complex queries. Anymeta3 also accepts UUIDs and URIs as IDs for many requests but only Anymeta4 implements a compatible URI schema. anymeya4 even goes one step further and allows to discover the available services.
View the auto-generated API documentation to get an overview of all available calls. The most important ones are explained here as well:
|anymeta.predicates.get||Get a specific data field, for instance the title of a thing.|
|anymeta.thing.dump||Get a full data-dump of a thing, including all references to its images, video files, etc.|
|anymeta.attachment.create||Create an attachment, e.g. upload an image or video into the system|
|anymeta.edge.add||Connect things in the database using edges, semantical links between things.|
|anymeta.search.live||Full-text search on the database|
|query.execute||Advanced, powerful interface for querying the semantic network and the thing database.|
|identity.search||Search the Identity database which stores RFID -- ID links|
|identity.add||Add an identity (e.g. an RFID tag) to the system|
An overview of some of the applications which have been developed and which interact with Anymeta.
- All Social RFID games developed during the Mediamatic Hackers Camp at PICNIC'08 interface with Anymeta, one way or another (see the source code)
- The photo/videobooth - Cocoa Mac application (SVN)
- anyIdentity (SVN) - QT4 application supporting RFID registration, API call testing
- friendDrinkStation (SVN) - aka. Andy's python boozer.
Interfacing with the API
Use Python! ;-) An open source library has been released which make life very easy. See the AnyMeta.py article which explains all about it.
All interaction is done through simple HTTP calls to the API controller.
For API interactions which need authentication, requests need to be signed with the OAuth standard, so using any OAuth implementation together with a HTTP libary (e.g. curl) will do the trick as well.