Tasty Client Implementations

# Client Implementations

Examples of client-side code for interacting with Tasty. If you have improvements on these, or additional examples in languages not covered here, please submit them.

## commandline

curl is very useful for testing out ideas from the command line, particularly with its -X flag. eg,

    curl -X POST -d "" http://localhost:9980/service/test/user/bob/item/foo/tag/blah/
    curl -X DELETE http://localhost:9980/service/test/user/bob/item/foo/tag/blah/

## python

    import httplib, urllib
    from simplejson import loads as json_to_py

    def get_tags(user,item):
        url = "http://tasty.example.com/service/myservice/user/%s/item/%s/" % (user,item)
        try:
            return [t['tag'] for t in json_to_py(urllib.urlopen(url).read())['tags']]
        except json.ReadException:
            return []

    def add_tag(user,item,tag):
        conn = httplib.HTTPConnection("tasty.example.com")
        url = "/service/myservice/user/%s/item/%s/tag/%s/" % (user,item,tag)
        conn.request("POST",url)
        response = conn.getresponse()
        conn.close()

sometimes, adding or deleting does not need to be done synchronously. if that's the case, you can eliminate http latency from bogging you down by spawning a new thread to make the request.

    from threading import Thread

    class Putter(Thread):
        def __init__(self,url):
            self.url = url
        def run(self):
            conn = httplib.HTTPConnection("tasty.example.com")
            conn.request("POST",self.url)
            r = conn.getresponse()
            conn.close()

    def add_tag(user,item,tag):
        p = Putter("/service/myservice/user/%s/item/%s/tag/%s/" % (user,item,tag))
        p.start()

but i recommend trying it first without the thread. the performance hit of making an http request to a (presumably) local service may be surprisingly small. a Twisted implementation would probably be even faster and cleaner, but i don't really know twisted very well. sample twisted client code is welcome.

also of interest may be this sample implementation of cloud scaling.

## perl

    my $TASTY_BASE = "tasty.example.com";
    my $TASTY_SERVICE = "example";

    sub tasty_get {
        use LWP::Simple;
        use JSON;
        my $url = shift;
        my $full = "http://${TASTY_BASE}/service/${TASTY_SERVICE}/$url";
        my $r = get $full;
        my $json = new JSON;
        my $obj = $json->jsonToObj($r);
        if (!$obj) {
            $obj = {};
        }
        return $obj;
    }

    use LWP::UserAgent;
    use HTTP::Request;
    use HTTP::Request::Common qw(POST);

    sub tasty_put {
        my $url = shift;
        my $ua = LWP::UserAgent->new;
        my $req = POST "http://${TASTY_BASE}/service/${TASTY_SERVICE}/$url", [];
        return $ua->request($req)->as_string;
    }

    sub tasty_delete {
        my $url = shift;
        my $ua = LWP::UserAgent->new;
        my $req = HTTP::Request->new(DELETE => "http://${TASTY_BASE}/service/${TASTY_SERVICE}/$url");
        my $res = $ua->request($req);
    }

## java

TODO

## PHP

TODO

## JavaScript

TODO