The book is incorrect. If you want to rely on the generic.json view to generate the JSON response, then you must return a dictionary (otherwise, no view will be called, and whatever you return will be returned directly). In this case, the .validate_and_insert method returns a DAL Row object (not a database record, just a Row object that contains "error" and "id" keys). Apparently, when you return a Row object, the response body ends up being just a concatenation of its keys, so in this case, we get "errorid" as the response.
You have a few options: 1. Put the result in a dictionary: return dict(result=db[table_name].validate_and_insert(**vars)) 2. Convert the Row object itself to a dictionary: return db[table_name].validate_and_insert(**vars).as_dict() 3. Return JSON directly: from gluon.serializers import json return json(db[table_name].validate_and_insert(**vars)) Anthony On Monday, November 9, 2015 at 10:50:21 AM UTC-5, Gary Cowell wrote: > > Lookint at providing simple REST API to database tables through web2py. I > used this example from the book: > @request.restful() > def secapi(): > 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 dict(GET=GET, POST=POST, PUT=PUT, DELETE=DELETE) > > > Now the GET methods work, I can get json responses with curl: > > curl http://localhost:8007/apitest/default/secapi/secrets.json > {"content": [{"datavalue": "foobar", "id": 1}, ... ]} > > > When I POST though: > > $ curl --data "datavalue=sometest" http: > //localhost:8007/apitest/default/secapi/secrets.json > > I get the response: > > errorsid > > When I really want the resource URL of the created thing. > > It did actually create the row: > > curl http://localhost:8007/apitest/default/secapi/secrets/id/20.json > {"content": [{"datavalue": "sometest", "id": 20}]} > > So my question is, how do I code the POST such that it returns the > resource URL that was created? > > Thanks > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.