Hi,

I tried to pull together the different sources for restful services, 
including various hints in this group and of course the excellent web2py 
documentation. If this is the wrong place or info, feel free to move or 
delete it.

Here's how you create a restful web2py application in under 2 minutes:
- create a wizard application called 'RT'
- add a table named 'entries' and add a field 'entry wiki'
- finish the wizard with all the default values
- register a user 'user' with password 'pass'
now you have an application with 10 random entries.

The next two step are required due to a bug that I filed before 
(http://goo.gl/CPO0G)
- go to the design page of the app and change the table name from 
't_entries' to 'entries'
  in db_wizard.py (4 times) and in default.py (1 time)
- check that the application is still working. you notice that the table 
now is empty since we changed
  the name of the table.
- Add a couple of entries.

- now add the RESTful services to the controller as described in 
http://goo.gl/iITNd ('parse_as_rest') 
  or here: http://goo.gl/ltfa2

@request.restful()
def api():
    response.view = 'generic.'+request.extension
    def GET(*args,**vars):
        patterns = 'auto'
        parser = db.parse_as_rest(patterns,args,vars)
        if parser.status == 200:
            return dict(content=parser.response)
        else:
            raise HTTP(parser.status,parser.error)
    def POST(table_name,**vars):
        return db[table_name].validate_and_insert(**vars)
    def PUT(table_name,record_id,**vars):
        return db(db[table_name]._id==record_id).update(**vars)
    def DELETE(table_name,record_id):
        return db(db[table_name]._id==record_id).delete()
    return locals()


- In the browser:
  you get all entries with
  http://127.0.0.1:8000/RT/default/api/entries.json

  you get the just the second entry with
  http://127.0.0.1:8000/RT/default/api/entries/id/2.json

  you get all auto-generated patterns with
  http://127.0.0.1:8000/RT/default/api/patterns.json

That's as far as we get with GET in a browser.

To make things more realistic, we add basic user authentication and try 
some POSTs with curl.
- Add 
    auth.settings.allow_basic_login = True
    @auth.requires_login()

  above @request.restful. Authentification now is mandatory for the REST 
interface.

- get the first entry
  curl --user user:pass 
http://127.0.0.1:8000/RT/default/api/entries/id/1.json

- post a new entry
  curl --user user:pass -d "f_entry=something" 
http://127.0.0.1:8000/RT/default/api/entries.json

- delete the first entry
  curl -X DELETE --user user:pass 
http://127.0.0.1:8000/RT/default/api/entries/1.json


Same thing from python:

import requests
from requests.auth import HTTPBasicAuth 
payload = {'f_entry': 'somevalue'}
auth=HTTPBasicAuth('user', 'pass')
r = requests.post("http://127.0.0.1:8000/RT/default/api/entries.json";, data=
payload, auth=auth)
r = requests.delete("http://127.0.0.1:8000/RT/default/api/entries/1.json",data
=payload, auth=auth)

-- 



Reply via email to