{float:right|width=40%} {panel:title=Contents} {toc} {panel} {panel:title=Points for discussion, resolution, further work} # Is the use of HTTP sessions necessary? Is it desirable? # Request signing methods? # Payload and response schemas must be defined # Should API contain admin functions? # Webhooks ([http://blog.webhooks.org/]) #* ESME has webhooks as part of its actions framework, but we may want to document their existence as part of the API, and possibly improve the functionality if there are use cases ([http://incubator.apache.org/esme/actions.html]) # What is a conversation? # Authorization approach (see above) # What is our streaming approach? {panel} {float}

Streams vs. Resources

In the design below, all parts of ESME are modeled as resources, in keeping with a RESTful approach. Our streaming resources (also thought of as delta-queue resources) are collections that are only additive. We have defined a general streaming interface that strives to be RESTful while prioritizing the performance benefits of streams.

References - Dev mailing list thread - http://www.mail-archive.com/esme-dev@incubator.apache.org/msg00976.html

Resource/Object/Stream Hierarchy

The above is based on a rough object hierarchy as follows:

  • ESME API instance (api/)
    • Session (api2/session)
    • Users (api2/users)
      • Specific User (api2/users/USERID)
        • User's tokens (api2/users/USERID/tokens)
    • Messages posted by logged in user (api2/user/messages) (1)
    • Users followed by logged in user (api2/user/followees)
    • Users following logged in user (api2/user/followers)
    • Trackers belonging to logged in user (api2/user/tracks)
      • Messages from a track (api2/user/tracks/TRACKID/messages) (1)
    • Actions belonging to logged in user (api2/user/actions)
    • Messages (api2/messages) (1)
    • Tags (api2/tags)
      • Messages posted to a tag (api2/tags/TAG/messages) (1)
    • Conversations (api2/conversations)
      • Messages posted to a conversation (api2/conversations/CONVERSATIONID/messages) (1)
    • Pools (api2/pools)
      • Users associated with a pool (api2/pools/POOLID/users)
      • Messages posted to a pool (api2/pools/POOLID/messages) (1)
    • Searches ?? (1)
    • Trends ??

(1) Stream interface

Each of these bullets represents a set of objects. The resource representing an individual object lives at api/objects/OBJECTID. For example, api/conversations/1. As much as is reasonable, one would expect to be able to GET (read), POST (create), PUT (update/amend), or DELETE (delete) any individual member of each of these object sets. Going through each of these objects to ask what it would mean to create, read, update, or delete that object may reveal holes in the existing API, some of which I have filled in above.

Methods, Resources, and Descriptions

Bold means the resource and method is implemented in the current /api2/ endpoint.

Resource

Method

Description/Payload schema/Response schema

Streaming?

Admin Only?

api2/session

GET,POST,DELETE

Post parameter: token

 

api2/users

GET, POST

Post parameters: nickname, password - returns: user created

 

POST

api2/users/USERID

GET

 

 

api2/users/USERID/tokens

GET, POST

Post parameters: description - returns: token created

 

GET, POST

api2/user/messages

GET,POST

Post parameters: message, via (opt), pool (opt), realm (opt), metadata (opt), tags (opt), replyto (opt)

Yes

api2/user/tags/TAG

GET

 

 

api2/user/tags/TAG/messages

GET

 

Yes

api2/user/followers

GET

 

 

api2/user/followees

GET,POST

Post parameter: userId

 

api2/user/followees/USERID

DELETE

 

 

api2/user/tracks

GET,POST

Post parameter: track (regex)

 

api2/user/tracks/TRACKID

GET,DELETE

 

 

api2/user/tracks/TRACKID/messages

GET

 

Yes

api2/user/actions

GET,POST

Post parameter: name, test, action

 

api2/user/actions/ACTIONID

GET,PUT,DELETE

Put parameter: enabled (boolean)

 

api2/messages/MESSAGEID

GET

 

 

api2/messages

GET,POST

 

Yes

api2/conversations/CONVERSATIONID

GET

 

 

api2/conversations/CONVERSATIONID/messages

GET,POST

 

Yes

api2/pools

GET,POST

 

 

api2/pools/POOLID

GET,DELETE

 

 

api2/pools/POOLID/users

GET,POST

Post parameters: realm, userId, permission

 

api2/pools/POOLID/users/USERID

DELETE

 

 

api2/pools/POOLID/messages

GET,POST

 

Yes

One point to note is that some HTTP clients do not currently support the "PUT" or "DELETE" methods, so these may have to be simulated through POST methods with an extra parameter. I think that because of the close mapping to resource verbs, is worth using these methods in the specification and defining the simulation method for the entire API separately.

Note on the call: api2/user/messages (http://esmecloudserverapache.dickhirsch.staxapps.net/api2/user/messages?via=SAPRiver&tag=bob&message=User+')

That call uses "tag", not "tags". Looking at the API2 code, the parameter name needs to be "tags". 

When it does work, I think the behavior may be a bit misleading, as tags added using the tags parameter do not necessarily show up in the message at all. So make sure to keep an eye on the tag cloud or go to the page for the specific tag you are trying to add and see if it shows up there.

Streams

There are a lot of ways we can model streams and I'm very interested in input here. Options for interfacing to streams that I have seen:

Authorization and roles

Certain API methods are only available to certain roles, as defined in property files. If an API method has a notation in the "Admin only?" column, this means that the user attempting to interact with that API method must have the proper role assigned in the relevant property file.

For example, take a look at the test.default.props file in the /server/resources/props directory.

Or, for example, create a prod.default.props file in the "server/resources/props" directory. In this file, add the line "role.myuser=integration-admin", where
"myuser" is the username that you want to have super-powers.
("integration-admin" is what we're calling the role.)

ESME HTTP Comet/long-polling implementation for streams

In general, for any resource URL that indicates streaming is implemented above, we will implement an HTTP-based streaming interface. This interface might better be referred to as a "delta" interface. The URL will behave as follows (we use api2/user/messages as an example):

URL

Request

Query Parameters

Behavior

api2/user/messages

GET

 

Returns any messages not already read by the client

api2/user/messages

GET

timeout=20

If new messages not already read by the client exist, these are returned. If no new messages exist, the request will stall for a number of seconds as defined in the timeout= parameter. If a new message arrives during this time, the request will immediately resolve, returning the new message.

api2/user/messages

GET

history=10

Returns the last 10 messages in the timeline

Response codes follow normal HTTP meanings:

Response Code

Meaning

200

Success - Response body should include messages

204

No Content - No new messages in the stream (only returned for base URL and ?timeout= requests, not for ?history= requests). Should be 304 Not Modified, but not currently supported in Lift.

403

Forbidden - Either the session is invalid or non-existent, or the user is not authorized to access the resource. Eventually we'll move to 401s for invalid/non-existent sessions, but currently we can't return a WWW-Authenticate header field that will result in the right behavior, so we're just stopping the request dead with a 403.

404

Not found - for example, a request for the stream of a tag that doesn't exist

Once this interface is implemented where planned for a URL, the "Yes" above in the "Streaming?" column will be bolded.

MESME delta message HTTP APIAPI 2.0 - Design2329310

Streams/Message-queues in ESME and in general

MESME message queuesAPI 2.0 - Design2329310

Formats

Request formats

Format specification

If there is a request body, format should be specified using the Content-Type HTTP header.

Formats to be supported

  • XML ?
  • JSON ?
  • Multi-part Form-encoded ?
  • Form-encoded

Response formats

Format specification

Format could be specified using the HTTP Accept header - http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Another option (though not as robust) would be to append the format to the resource request url. For example /api/users/USERID.json

Formats to be supported

  • XML ?
  • JSON ?
  • ...

Authorization

Currently the ESME REST API uses tokens as the authorization mechanism. A token is used to establish a session and then the session is used to persist the authorization of the API client across the length of the session.

There are a couple of problems with this, though we don't have a better approach at the moment:

  1. Sessions are not natively supported in a lot of API programming environments, especially environments that do not have a persistent data-store available to the application.
  2. The current API design appears encourage that the token sent to establish the session be sent in the clear over an unencrypted connection.

Clients

Daniel Koller has created an initial client for the Streaming api. The client is currently attached to a Jira item

  • No labels

9 Comments

  1. Additional point for discussion:

    • Should the API contain admin functions? (based on a backend authorization check)
    1. My take on this is that there are two possible answers, depending on the user schema.

      If admins are normal users that have additional capabilities, then yes this API should contain admin functions. If admins are a totally separate type of user from a normal user, then there should probably be a separate admin API.

      I'd be partial to the later approach, but I don't see a major issue with either approach.

  2. Perhaps we consider methods like the Twitter Search function (http://apiwiki.twitter.com/Twitter-Search-API-Method%3A-search) and the Twitter trends function (http://apiwiki.twitter.com/Twitter-Search-API-Method%3A-trends)

    This would enable us to bring more "social effects" to esme.(means tools to make users aware of conversations)

    1. Interesting. I've added to the page. This would be new as I don't think any of this is included in the existing API. Not sure how difficult it will be to hook into the search functionality that is currently running or if there is already an API available.

  3. It seems like it would make sense to include webhooks in the API for ESME...

    1. Hey Jeff, thanks for stopping by. I've put this under the discussion section. Actually, ESME already has webhooks as part of its (really quite awesome) actions framework!

  4. Concerning authorization why not make it possible to use an single signon system like CAS?

    1. Actually, we've been talking to developer in China about adding CAS authorization to ESME. He hopes to get around to it after XMas.

    2. Agreed with regards to ESME-proper. I'm not sure that single-sign-on is always appropriate for an API so we need to provide other client authentication methods as well.