Wellicht niet het antwoord wat je zocht, maar je zou eens naar deze pdf kunnen kijken welke ik toevallig gisteren tegen kwam:
http://info.apigee.com/Portals/62317/docs/web%20api.pdf
Wat bij REST heel belangrijk is, is de relatie tussen verschillende resources (entiteiten, collecties & services). Zo kan ik me voorstellen dat je in de toekomst meer eigenschappen voor een user krijgt dan alleen een shoppinglist.
Dan kan je bijvoorbeeld ook url's gebruiken als:
/api/user/{username} en /api/user/{username}/shoppinglists
Mocht een user dan bijv. ook een naam hebben kan je die relaties aanduiden met bijv:
<user>
<name>voor & achternaam</name>
<shoppinglists href="/api/user/someUsername/shoppinglists" />
</user>
Een shoppinglist kan er dan bijv. als volgt uit zien:
<shoppinglist>
<user href="/api/user/{username}" />
<product href="/api/product/1234" />
<product href="/api/product/654" />
<product href="/api/product/9182" />
</shoppinglist>
Zoeken product op zoekterm of streepjescode
GET
/api/products/keyword/{keyword}
GET
/api/products/barcode/{barcode}
Je kan je afvragen of een keyword nu wel een (verzameling van) resource(s) is. Als dat niet het geval is (en ik denk dat dat niet het geval is), dan zou dat eigenlijk niet in de url zelf moeten zitten.
Wat je bijv. wel kan doen is iets als /api/products?q=barcode:{barcode}
Met REST is de URL de identifier van je resource. In principe zou iedere resource ook maar gerepresenteerd moeten worden door 1 url (immers, hoe kan je meerdere id's hebben per resource?). Door ?q= te gebruiken blijft het deel voor de query string intact, en zorg je er dus voor dat iedere resource slechts 1 url heeft (voor het gemak tel ik de query string nietmee als onderdeel van de url in deze context).
Waar je op een gegeven moment tegen aan gaat lopen is dat een query string een maximale lengte heeft. Welke dit precies is kan verschillen per proxy en webserver, maar ergens zit een max. Op dat moment kan je beter je zoekopdracht in de request body opgeven. Echter, een request body opgeven bij een GET request kan in ongedefinieerd gedrag resulteren (volgens rfc2616 hoeven request bodies bijv. niet gecached te worden). POST'en naar een collectie is ook geen optie, want dan voeg je een entry toe in plaats van te zoeken.
Gelukkig _mag_ je binnen REST ook services toepassen (om Roy Fielding te parafraseren "A resource is something of which you can say what it is, not what it does"). Hier moet je wel voorzichtig mee zijn, en zou uitzondering moeten zijn, om te voorkomen dat je alsnog een xml-rpc service gaat bouwen. Omdat het bij REST wel om pragmatisme gaat gebruik ik hier standaard een search service voor. Stel dan dat je uitgebreid wil zoeken op products, dan zou je kunnen POSTen naar /api/products/search en daarbij in bijv. een xml document je zoekparameters definieren. Vervolgens kan een dergelijke service een document serveren als:
<products>
<product href="/api/product/123">
</products>
Wat je ook zou kunnen doen is deze zoekopdracht in je api opslaan. Om na het aanroepen van de search service te redirecten met een 302 of een 303 status code, afhankelijk van of je deze zoekopdracht wil persisteren. De url waar je dan naar redirect is dan bijv. /api/products?searchId=123981
Let hierbij wel op dat je niet iets als sessies (of .net's counterpart) kan gebruiken, daar REST api's stateless zouden moeten zijn.
Al met al REST FTW. maar het kost wel wat tijd om er 'behendig' in te worden

Er is overigens ook een
api-craft mailinglist waar heel veel zinnige resources te vinden zijn.
Mocht je het verder interessant vinden zou je ook eens kunnen zoeken op termen als ETags & HATEOAS. En verder iedere avond voor het naar bed gaan RFC 2616 uit je hoofd leren, 's ochtends Roy Fieldings thesis uit je hoofd leren. En deze twee documenten ook als bookmark instellen
Oh, en als je bezig gaat met het wijzigen van resources, bekijk dan ook even
RFC5789, en vraag je af of je niet beter PATCH kan gebruiken dan PUT (wat volgens mij nog 'de standaard' is binnen .NET REST omgevingen).
offtopic:
Zoals hierboven al gemeld is REST geen harde set regels. Wat in deze post staat zijn wat beginselen en best-practices zoals ik ze ervaar als ik een RESTful api maak (wat meer dan de helft van mijn werk inhoudt). Het kan goed zijn dat anderen hier een andere mening over hebben... =)
[
Voor 8% gewijzigd door
Freeaqingme op 18-04-2012 19:45
]
No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.