· 7 years ago · Mar 04, 2019, 04:04 PM
1#!/usr/bin/python3
2"""
3Implementasi sederhana RESTful API menggunakan Flask.
4Flask harus terlebih dahulu diinstal di komputer.
5SQLite digunakan untuk contoh sederhana penyimpanan ke database.
6
7Dibuat oleh Pipin Fitriadi (email: pipinfitriadi@gmail.com),
8pada tanggal 28 Februari 2019.
9"""
10import json
11import sqlite3
12from sqlite3 import Error
13
14from flask import abort, Flask, jsonify, redirect, request, url_for
15
16def create_connection():
17 """
18 Fungsi untuk terhubung dengan database SQLite.
19 """
20 try:
21 return sqlite3.connect('restful_api_with_flask.db')
22 except:
23 print('Error! cannot create the database connection.')
24 return None
25
26def create_table():
27 """
28 Fungsi untuk membuat table 'users' di database, apabila tidak ada.
29 """
30 try:
31 with create_connection() as conn:
32 c = conn.cursor()
33 c.execute('''
34 CREATE TABLE IF NOT EXISTS users(
35 id integer PRIMARY KEY,
36 name text NOT NULL
37 );
38 ''')
39 except Error as e:
40 print(e)
41
42def get(id=None, is_set=False):
43 """
44 Fungsi untuk mendapatkan data dari table 'users'.
45 Key parameter id adalah integer dan tidak mandatory.
46 Key parameter is_set adalah boolean dengan default nilai False.
47 """
48 with create_connection() as conn:
49 c = conn.cursor()
50
51 if id:
52 c.execute(
53 '''
54 SELECT *
55 FROM users
56 WHERE id = ?;
57 ''',
58 (id,)
59 )
60
61 row = c.fetchall()
62
63 if row:
64 row = row[0]
65 data = {
66 'id': row[0],
67 'name': row[1]
68 }
69 else:
70 data = []
71 else:
72 c.execute(
73 '''
74 SELECT *
75 FROM users;
76 ''',
77 )
78
79 data = [
80 {
81 'id': row[0],
82 'name': row[1]
83 } for row in c.fetchall()
84 ]
85
86 if data:
87 data = {
88 'code': 200,
89 'message': 'User berhasil ditemukan.',
90 'data': data
91 }
92
93 if is_set:
94 data['code'] = 201
95 data['message'] = 'Data user barhasil tersimpan.'
96 else:
97 abort(404)
98
99 return data
100
101def post():
102 """
103 Fungsi untuk menambahkan data ke table 'users'.
104 Key parameter name adalah string dan mandatory.
105 """
106 with create_connection() as conn:
107 c = conn.cursor()
108
109 if request.json:
110 name = json.loads(
111 request.data
112 ).get('name')
113 else:
114 name = request.form.get('name')
115
116 if name:
117 c.execute(
118 '''
119 INSERT INTO users(name)
120 VALUES(?);
121 ''',
122 (name,)
123 )
124
125 id = c.lastrowid
126 else:
127 abort(400)
128
129 return get(id, True)
130
131def put(id):
132 """
133 Fungsi untuk mengubah salah satu data di table 'users'.
134 Key parameter id adalah integer dan tidak mandatory.
135 Key parameter name adalah string dan mandatory.
136 """
137 with create_connection() as conn:
138 c = conn.cursor()
139
140 if request.json:
141 name = json.loads(
142 request.data
143 ).get('name')
144 else:
145 name = request.form.get('name')
146
147 if name:
148 c.execute(
149 '''
150 UPDATE users
151 SET name = ?
152 WHERE id = ?;
153 ''',
154 (name, id)
155 )
156 else:
157 abort(400)
158
159 return get(id, True)
160
161def delete(id):
162 """
163 Fungsi untuk menghapus salah satu data di table 'users'.
164 Key parameter id adalah integer dan tidak mandatory.
165 """
166 with create_connection() as conn:
167 c = conn.cursor()
168
169 c.execute(
170 '''
171 DELETE
172 FROM users
173 WHERE id = ?;
174 ''',
175 (id,)
176 )
177
178 return {
179 'code': 200,
180 'message': 'Data user berhasil dihapus.',
181 'data': None
182 }
183
184def response_api(data):
185 """
186 Fungsi untuk menampilkan data kedalam format Json.
187 Key parameter data adalah dictionary dan mandatory.
188 Berikut ini adalah contoh pengisian key parameter data:
189 data = {
190 'code': 200,
191 'message': 'User berhasil ditemukan.',
192 'data': [
193 {
194 'id': 1,
195 'name': 'Kuda'
196 }
197 ]
198 }
199 """
200 return (
201 jsonify(**data),
202 data['code']
203 )
204
205app = Flask(__name__)
206
207@app.errorhandler(400)
208def bad_request(e):
209 return response_api({
210 'code': 400,
211 'message': 'Ada kekeliruan input saat melakukan request.',
212 'data': None
213 })
214
215@app.errorhandler(404)
216def not_found(e):
217 return response_api({
218 'code': 404,
219 'message': 'User tidak berhasil ditemukan.',
220 'data': None
221 })
222
223@app.errorhandler(405)
224def method_not_allowed(e):
225 return response_api({
226 'code': 405,
227 'message': 'User tidak berhasil ditemukan.',
228 'data': None
229 })
230
231@app.errorhandler(500)
232def internal_server_error(e):
233 return response_api({
234 'code': 500,
235 'message': 'Mohon maaf, ada gangguan pada server kami.',
236 'data': None
237 })
238
239@app.route('/')
240def root():
241 return 'RESTful API Sederhana Menggunakan Flask'
242
243@app.route('/users', methods=['GET', 'POST'])
244@app.route('/users/<int:id>', methods=['GET', 'PUT', 'DELETE'])
245def users(id=None):
246 """
247 RESTful API /users.
248 """
249 if request.method == 'GET':
250 data = get(id)
251 if request.method == 'POST':
252 data = post()
253 elif request.method == 'PUT':
254 data = put(id)
255 elif request.method == 'DELETE':
256 data = delete(id)
257
258 return response_api(data)
259
260if __name__ == '__main__':
261 create_table()
262 app.run(debug=True)