Day 07 - RESTful API 在 Amazon Linux 2 上传图片实作
RESTful API 规格书
因为 RESTful API 需要前后端的合作,前端呼叫,后端设计开发,因此最好在正式运作之前先撰写 RESTful API 规格书,如下图所示。必须要确认的资讯有:
- 功能说明:用来说明这个服务所提供的目的。
- 服务路径 (URI): /imgUpload/
- 请求方法:POST
- 请求格式:multipart/form-data,需要说明,不然前端不知该如何传递资料的编码方式。
- 请求输入的参数说明:fileUpload,这必须要前后端一致,所以必须好好描述,名称是必要的,资料型态也要确认,有些参数是选择性的,也可以在说明中详述。
- 回应格式:JSON,这是前端需要清楚,这样才能知道该如何处理资料。
- 回应内容说明:fishQtn,如同请求输入的参数说明一样,必须要告诉后端开发者,前端的需求。
- 请求回应范例:最好是提供,这样可以让前后端开发者都可以测试功能是否正确。
图 1、上传图片的 RESTful API 规格范例
设定前端请求
有了这个规格书,就可以开始进行后端的开发,很明显的,我们这个专案只需要一个 RESTful API 功能,就是上传一张图片,由后端来判断这张图片是属于哪一种鱼类,但因为鱼类辨识功能尚未实作,所以我们在此只完成上传图片功能,而回应部分就固定回应一个答案就好,这样方便前端进行开发。
打开 Advanced REST Client (ARC)并根据规格书来进行设定,如下图所示:
-
请求方法:POST
-
服务路径 (URI): http://[EC2_IPv4]:8000/imgUpload/
-
请求格式:选择 BODY 页签,格式选择 Multipart form data。
-
请求输入的参数说明:点选下方的 ADD FILE PART 按钮,输入
- Name: fileUpload
- Value: 点击 CHOOSE FILE 按钮,可以让使用者从电脑中选择一个图片
图 2、Advanced REST Client 设定前端请求
进行后端 Django 撰写
打开终端机或是 Putty 连线到 AWS EC2,进行 Django 后端程式的撰写,因为对应到的是 POST 的请求,所以只需要修改 post 方法的修改即可。
新增一个文件夹 upload 用来存放图片,要特别注意相对应的文件夹位置,upload 的所在位置与 fishsite 应用是同等的,如下图所示。
cd ~/fishRecognition/fishsite
mkdir upload
图 3、图片文件夹的所在位置
修改 fishsite/view.py 的 post 方法,主要有三部分,第一部分是接收前端所传来的图片,第二部分是查询资料库,而第三部分则是加上 fishQtn 鱼只数量的栏位,以符合规格书的要求
def post(self, request, *args, **krgs):
print('FishView->post')
uploadFile = request.FILES.get('fileUpload')
# write the uploaded file into the server
filename = r'upload/{}'.format(uploadFile.name)
with open(filename, 'wb') as f:
for chunk in uploadFile.chunks():
f.write(chunk)
print('FishView->upload')
sql = "SELECT fishName, distribution, LatinName FROM fishInfoTbl WHERE mark=1"
with connection.cursor() as cursor:
cursor.execute(sql)
data = dictfetchall(cursor)
print('FishView->' + sql)
data[0]['fishQtn']=1
return JsonResponse(data,safe=False)
图 4、后端 RESTful API 部分程式码
完成了这一部分程式码后就可以启动 Django Web 伺服器功能,然后透过 ARC 来呼叫后端服务,成功的话可以看到以下的画面,正常回传回应。
python3 manage.py runserver 0.0.0.0:8000
图 5、ARC 来呼叫后端服务
也在到后端去确认一下档案是否有写入,除了确认档案名称外,也要确认档案大小是否正确,如下图所示。
图 6、确认后端是否有正确接收档案
参考资料
- 用 Django REST Framework 撰寫 RESTful API 並生成 Swagger 文檔(上) — 用Django REST Framework 撰寫 RESTful API, zoejoyuliao.medium.com/用-django-re…
- Django rest framework: How to make a simple file upload API using viewsets, joel-hanson.medium.com/drf-how-to-…
- Generic views, www.django-rest-framework.org/api-guide/g…
- Django REST framework 实现文件上传的两种方式, www.starky.ltd/2019/12/21/…