0

我需要创建以下内容...使用 RESTful 设计模式实现以下 URI 的基本 Web 服务:

http://localhost/hello?name=”world”

上面的 URI 应该返回以下 JSON 格式的文本:

{ hello: “world” }

但我在试图弄清楚这一点以及将其放置在已创建的代码中的位置时遇到了麻烦。

#!/usr/bin/python
import json
from bson import json_util
import bottle
from bottle import route, run, request, abort

# set up URI paths for REST service
@route('/currentTime', method='GET')
def get_currentTime():
    dateString=datetime.datetime.now().strftime("%Y-%m-%d")
    timeString=datetime.datetime.now().strftime("%H:%M:%S")
    string="{\"date\":"+dateString+",\"time\":"+timeString+"}"
    return json.loads(json.dumps(string, indent=4,default=json_util.default))

if __name__ == '__main__':
    #app.run(debug=True)
    run(host='localhost', port=8080)
4

1 回答 1

0

动态编程是 API 的最佳选择。

from bottle import Bottle, get, post, request, response, route, abort, template, redirect, run
import ujson as json
import datetime
from bson import json_util

class Api(object):
    def __init__(self, request, option):
        self.option = option
        self.payload = merge_dicts(dict(request.forms), dict(request.query.decode()))

    def currentTime(self):
        dateString=datetime.datetime.now().strftime("%Y-%m-%d")
        timeString=datetime.datetime.now().strftime("%H:%M:%S")
        string="{\"date\":"+dateString+",\"time\":"+timeString+"}"
        return string

    def hello(self):
        return {'hello' : self.payload['name']}

@get('/api/<command>')
@post('/api/<command>')
@get('/api/<command>/<option>')
@post('/api/<command>/<option>')
def callapi(command = None, option = None):
    A = Api(request, option)
    func = getattr(A, "{}" .format(command), None)
    if callable(func):
        result = func()
        if result:
            if request.method == 'GET':
                response.headers['Content-Type'] = 'application/json'
                response.headers['Cache-Control'] = 'no-cache'
            return json.dumps(result, indent=4,default=json_util.default)
        else:
            return json.dumps({})

def merge_dicts(*args):
    result = {}
    for dictionary in args:
        result.update(dictionary)
    return result

if __name__ == '__main__':
    #app.run(debug=True)
    run(host='localhost', port=8080)

这样做是让您现在可以在 Api 类下简单地创建新函数,它们会动态地成为 URL 路由。如果需要,您可以通过请求从 API 方法中检查 post 或 get。我合并来自表单或查询字符串的有效负载,以便您可以接受任何一个,并且它处理单个有效负载。

该选项只是为了以防您想为路线提供更多功能。

于 2019-02-18T19:58:33.487 回答