Создание базового дизайна RESTful - PullRequest
0 голосов
/ 16 февраля 2019

Мне нужно создать следующее ... базовый веб-сервис, использующий шаблон проектирования RESTful для реализации следующих URI:

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)

1 Ответ

0 голосов
/ 18 февраля 2019

Динамическое программирование - ваш лучший выбор для 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 через запрос.Я объединяю полезные данные из формы или строки запроса, чтобы вы могли принять любой из них, и он обрабатывает одну полезную нагрузку.

Опция на всякий случай, если вы хотите больше функциональности для маршрута.

...