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.

Reply via email to