I found a brilliant script to handle API requests. I noticed three elements here: it contains a server process, it is able to receive a call and it is able to return results.
The script:
import flask
from flask import request, jsonify
import pyodbc
import pandas as pd
app = flask.Flask(name)
app.config["DEBUG"] = True
def dict_factory(cursor, row):
d = {}
for idx, col in enumerate(cursor.description):
d[col[0]] = row[idx]
return d
@app.route('/', methods=['GET'])
def home():
return '''Distant Reading Archive'''
@app.route('/api/v1/resources/books/all', methods=['GET'])
def api_all():
connStr = pyodbc.connect('DSN=AzureSQL;UID=tomvanmaanen;PWD=****')
cursor = connStr.cursor()
data = []
rows = cursor.execute('SELECT * FROM books;').fetchall()
for row in rows:
data.append([x for x in row])
cursor.close()
connStr.close()
return jsonify(data)
@app.errorhandler(404)
def page_not_found(e):
return "404 The resource could not be found.", 404
@app.route('/api/v1/resources/books', methods=['GET'])
def api_filter():
query_parameters = request.args
id = query_parameters.get('id')
published = query_parameters.get('published')
author = query_parameters.get('author')
query = "SELECT * FROM books WHERE"
to_filter = []
if id:
query += ' id=? AND'
to_filter.append(id)
if published:
query += ' published=? AND'
to_filter.append(published)
if author:
query += ' author=? AND'
to_filter.append(author)
if not (id or published or author):
return page_not_found(404)
query = query[:-4] + ';'
connStr = pyodbc.connect('DSN=AzureSQL;UID=tomvanmaanen;PWD=*****')
cursor = connStr.cursor()
data = []
rows = cursor.execute(query, to_filter).fetchall()
for row in rows:
data.append([x for x in row])
cursor.close()
connStr.close()
return jsonify(data)
app.run()
This API can be called by two different calls:
http://127.0.0.1:5000/api/v1/resources/books?author=Connie+Willis
or
http://127.0.0.1:5000/api/v1/resources/books/all
It can be see in the code what happens. If we call http://127.0.0.1:5000/api/v1/resources/books/all, we see that a function is used that is provided after the definition of “/api/v1/resources/books/all”. In that function, we a sql is fired that is “SELECT * FROM books;”. We see that the query results are returned as a json file.
As it is a GET call, the results are simply returned to the client.
If we call “127.0.0.1:5000/api/v1/resources/books?author=Connie+Willis”, we see what happens after the definition /api/v1/resources/books, in combination with some arguments. The arguments are provided after the ? mark. We see that parameter author is used. When that parameter is used, a query is used that is formulated as “SELECT * FROM books WHERE author = Connie+Willis”