RESTful API 在 Amazon Linux 2 上传图片实作-Day 07

RESTful API 在 Amazon Linux 2 上传图片实作-Day 07

RESTful API 规格书

因为 RESTful API 需要前後端的合作,前端呼叫,後端设计开发,因此最好在正式运作之前先撰写 RESTful API 规格书,如下图所示。必须要确认的资讯有:

  • 功能说明:用来说明这个服务所提供的目的。
  • 服务路径 (URI): /imgUpload/
  • 请求方法:POST
  • 请求格式:multipart/form-data,需要说明,不然前端不知该如何传递资料的编码方式。
  • 请求输入的参数说明:fileUpload,这必须要前後端一致,所以必须好好描述,名称是必要的,资料型态也要确认,有些参数是选择性的,也可以在说明中详述
  • 回应格式:JSON,这是前端需要清楚,这样才能知道该如何处理资料。
  • 回应内容说明:fishQtn,如同请求输入的参数说明一样,必须要告诉後端开发者,前端的需求。
  • 请求回应范例:最好是提供,这样可以让前後端开发者都可以测试功能是否正确。

https://ithelp.ithome.com.tw/upload/images/20210907/2012951058Prr1H7lf.png
图 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 按钮,可以让使用者从电脑中选择一个图片

https://ithelp.ithome.com.tw/upload/images/20210907/20129510d0Yo8iz25V.png
图 2、Advanced REST client 设定前端请求

进行後端 Django 撰写

打开终端机或是 Putty 连线到 AWS EC2,进行 Django 後端程序的撰写,因为对应到的是 POST 的请求,所以只需要修改 post 方法的修改即可。
新增一个文件夹 upload 用来存放图片,要特别注意相对应的文件夹位置,upload 的所在位置与 fishsite 应用是同等的,如下图所示。

cd ~/fishRecognition/fishsite
mkdir upload

https://ithelp.ithome.com.tw/upload/images/20210907/201295100AzVyKN5Lb.png
图 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)

https://ithelp.ithome.com.tw/upload/images/20210907/20129510NhPIOI59NG.png
图 4、後端 RESTful API 部分程序码

完成了这一部分程序码後就可以启动 Django Web 服务器功能,然後透过 ARC 来呼叫後端服务,成功的话可以看到以下的画面,正常回传回应。

python3 manage.py runserver 0.0.0.0:8000

https://ithelp.ithome.com.tw/upload/images/20210907/20129510gIfmU6BDdU.png
图 5、ARC 来呼叫後端服务

也在到後端去确认一下档案是否有写入,除了确认档案名称外,也要确认档案大小是否正确,如下图所示。

https://ithelp.ithome.com.tw/upload/images/20210907/20129510VSeskLiFcl.png
图 6、确认後端是否有正确接收档案

参考资料


<<:  Day07. 想练成 Blue Prism太极拳吗? 忘记所有的招式吧!-从Excel Worksheet读取表格资料

>>:  Day 07 生命周期(Lifetime)

【VidPaw 替代品】 Windows/Mac 轻松下载在线影片

VidPaw 是一个在线影片下载器,可以提供在线影片下载服务。 它支援广泛的网站,如 YouTube...

Angular 深入浅出三十天:表单与测试 Day25 - 测试进阶技巧 - DI 抽换

好一阵子没写单元测试与整合测试了,大家是否觉得有些生疏了呢? 之前的测试都写得很简单,正好昨天好好...

Dungeon Mizarka 005

UI版面配置 几近年的FPDC游戏,单角色的控制多以First Preson Shooter玩法为主...

2021 Updated CIS-SIR Exam Questions

Want to pass the CIS-SIR exam on your first attem...

每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day26

tags: ItIron2021 Javascript 前言 昨天我们开始了新的系列,剩下这几天也会...