minisaurus
minisaurus

Reputation: 1196

Restful API with web.py

In PHPs Slim I can do this:

$app->get('/table/{table}', function (Request $request, Response $response, $args) {
    $table = $args['table'];
    $mapper = new TableMapper($this, $table);
    $res = $mapper->getTable();
    return $response->withJson($res);
}
$app->get('/table/{table}/{id}', function (Request $request, Response $response, $args) {
    $table = $args['table'];
    $id = (int)$args['id'];
    $mapper = new TableMapper($this, $table);
    $res = $mapper->getTableById($id);
    return $response->withJson($res);
}

Now I'm trying with web.py. I can do this:

urls = (
    '/table/(.+)', 'table',
)
class table:
    def GET( self, table ):
        rows = db.select( table )
        web.header('Content-Type', 'application/json')
        return json.dumps( [dict(row) for row in rows], default=decimal_default )

but if I try to extend this by doing, e.g.:

urls = (
    '/table/(.+)', 'table',
    '/table/(.+)/(\d+)', 'table_by_id'
)

Processing never arrive at the second of the urls. Instead the code does a db.select on a table name which is "table/id", which of course errors.

How can I develop this to parse a url with id added?

Upvotes: 1

Views: 874

Answers (2)

pbuck
pbuck

Reputation: 4561

web.py matches in order listed in urls, so switching the order is one way to solve your issue:

urls = (
    '/table/(.+)/(\d+)', 'table_by_id',
    '/table/(.+)', 'table'
)

Another piece of advice: Tighten up your regex, so you match more closely exactly what you're looking for. You'll find bugs sooner.

For example, you'll note your /table/(.+) will indeed match "/table/foo/1", because the regex .+ also matches /, so you might consider a pattern like ([^/]+) to match "everything" except a slash.

Finally, no need for a leading '^' or trailing '$' in your URLs, web.py always looks to match the full pattern. (Internally, it adds '^' and '$').

Upvotes: 4

GLR
GLR

Reputation: 1120

Try this one:

urls = (
    '^/table/(.+)/$', 'table',
    '^/table/(.+)/(\d+)/$', 'table_by_id'
)

Upvotes: 0

Related Questions