The Ext Webtop and the Drupal WebOS are two independent systems loosely coupled that follow a service-oriented architecture. The Webtop requests and receives services from the WebOS. The serviceLink is a structured format that links services together. All services served by the WebOS are well described, allowing the Webtop to do some intelligent data binding. When a serviceLink is invoked, the Webtop verifies what are the required and optional parameters and matches that with the data provided.
The following is a simplified description of the user.list service:
{"method": "user.list",
"args": [{"name": "uid", type: "int", "desc": "User ID", "required": "0"}],
"return": [
{"name": "name", type: "string", "desc": "Name of the User"},
{"name": "sl", type: "int", "desc": "ServiceLink"},
{"name": "uid", type: "int", "desc": "User ID"}],
"type": "list"}
And a simplified description of the user.load service is presented below:
{"method": "user.load",
"args": [{"name": "uid", type: "int", "desc": "User ID", "required": "1"}],
"return": [
{"name": "uid", type: "int", "desc": "User ID"},
{"name": "name", type: "string", "desc": "Name of the User"},
{"name": "mail", type: "string", "desc": "Email of the User"},
{"name": "picture", type: "string", "desc": "Picture of the User"}],
"type": "form"}
This might be the JSON result returned when requesting user.list:
{"list":{"items":
[{"name":"Ariel Kempf", "sl":"1", "uid":"2"},
{"name":"Jorge Trierweiler", "sl":"1", "uid":"4"},
{"name":"Marcelo Farenzena", "sl":"1", "uid":"7"},
{"name":"Ricardo Duraiski", "sl":"1", "uid":"3"}],
"total_count":"4","version":"1"},
"servicelink":{
"fields":["sl"],
"actions":[
{"Select All":"javascript:selectall()"},
{"Unselect":"javascript:unselect()"},
{"Add New":"local:user.add"},
{"Delete":"local:user.delete"}],
"prefix":[{"local":"http:\/\/localhost\/drupal\/services\/json?method="}],
"alias":[{"1":"local:user.load"}]
}}
The list provided can have special fields representing a serviceLink. This is specified in the serviceLink’s “fields”. In this case, we have only one field: “sl”. It’s also possible to call multiple services simultaneously. All we have to do is add new fields and list them in the serviceLink’s “fields”. This way, we can display a new list, a form, a media, fetch some data, all at the same time.
A serviceLink can be a remote service from any network, or a javascript function. The “actions” provides data that populates the menu in the list’s toolbar. This let’s users perform actions. For example, the user can select a specific user and delete it (local:user.delete). Or the user may select all users (javascript:selectall()) and perform some other action. The “prefix” tells the Webtop that it should substitute “local” for “http://localhost/drupal/services/json?method=”.
By clicking on the first row (Ariel Kempf), the user.load service is called. This service requires uid as a parameter. The Webtop performs some intelligent data binding and passes the uid from this first row (uid=2). The user.load service returns a form. This form is displayed inline, showing more details about this particular user.
One other interesting thing to notice is the use of “alias” as a shortcut. This is important for a long list where for any row we call one unique service (or a few different services). If all services are different, then there is no need to add an alias.

[...] from the server-side by calling an appropriate service. Services may be interlinked with the serviceLink metadata. To allow secure cross-site access, JSONP is [...]