This blog post is a continuation of my Google Home\Google Action side project. The first blog post is here.
The project keeps evolving the more I think about it. The 2 diagrams below illustrate the workflows that need to be developed.
Populate the Database – Workflow 1

Google Home\Google Action – Workflow 2

So as you can see above, a critical piece of this puzzle is the REST API that needs to be created to allow us to interact with the data.
For the REST API, I have decided to use Python, Flask, and Flask-RESTful. For this service I can host the API instance on Heroku if needed. As for which database to use, I am thinking MongoDB, and if needed host it online with mLab. Tools I will use to help get this API created are Postman, Curl, and PyCharm. (Great resource)
First – Lets stub out the RestAPI code and the HTTP method “flask-restful” classes using PyCharm.

Below is a “rough” first draft of the python REST API.
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource
app = Flask(__name__)
api = Api(app)
# Sample lunch menu data for testing
LUNCHMENU = {
'4202017': {'menu': 'Main entry is corn dogs'},
'4212017': {'menu': 'Main entry is chicken nuggets'},
'4222017': {'menu': 'Main entry is tacos'},
}
# Argument parser - must add all arguments explicitly here
parser = reqparse.RequestParser()
parser.add_argument('item')
parser.add_argument('date')
# Check if item exists and error if it doesn't
def error_if_item_doesnt_exist(id):
if id not in LUNCHMENU:
abort(404, message="Menu Item {} doesn't exist".format(id))
# Check if item exists and error if it does
def error_if_item_does_exist(id):
if id in LUNCHMENU:
abort(404, message="Menu Item {} exist".format(id))
# Define get, delete, and put method class
class MenuItem(Resource):
def get(self, id):
error_if_item_doesnt_exist(id)
return LUNCHMENU[id]
def delete(self, id):
error_if_item_doesnt_exist(id)
del LUNCHMENU[id]
return '', 204
def put(self, id):
args = parser.parse_args()
LUNCHMENU[id] = {'item': args['item']}
return LUNCHMENU[id], 201
# Define list and post method class
class MenuList(Resource):
def get(self):
return LUNCHMENU
def post(self):
args = parser.parse_args()
error_if_item_does_exist(args['date'])
LUNCHMENU[args['date']] = {'item': args['item']}
return LUNCHMENU[args['date']], 201
# Setup Api resource routing to classes here
api.add_resource(MenuList, '/menuitems')
api.add_resource(MenuItem, '/menuitems/<id>')
# If program is executed itself, then run
if __name__ == '__main__':
app.run(debug=True)
Next step will be to true up the code to accept\parse the incoming JSON and then send the correct JSON format back to the API.AI agent.
- Request format – https://docs.api.ai/docs/webhook#section-format-of-request-to-the-service
- Response format – https://docs.api.ai/docs/webhook#section-format-of-response-from-the-service
Thanks for the demonstration on how to use REST API and Python. API’s are clearly becoming a huge trend in the programming world!!!
LikeLike