如何为逐步连续上传用例制作 API 端点?

Posted

技术标签:

【中文标题】如何为逐步连续上传用例制作 API 端点?【英文标题】:How to make API endpoints for stepwise continuous upload use case? 【发布时间】:2021-11-24 11:10:36 【问题描述】:

我在 android 前端 REST API 调用方面有很好的经验,但我对后端和学习 Django 框架非常陌生,因此我需要帮助来设计以下 API 端点。

为了更好地理解,我在这里上传了一个视频https://youtu.be/z87Hz1uHrYY。

这是我正在考虑做的解决方案,

    ) HTTP-Method: POST
      EndPoint URL:  /recipe/ 
      Request Params: "name":"Pizza" "image": pizza.png 
      Response Params: "id":"123xyz" // unique id
    
    ) HTTP-Method PATCH 
      EndPoint URL: /recipe/123xyz/ 
      Request Params: "serving":2, "difficulty": "m", "prep_time": 80 
      Response Params:   "id":"123xyz", "serving":2, "difficulty": "m", "prep_time": 80 
    
    ) HTTP-Method: PATCH 
      EndPoint URL: /recipe/123xyz/ingredients/ 
      Request Params: ["ingredient":”rice”, “amount”: “1/2”, “unit”: “g”,"ingredient":”water”, “amount”: “1/2”, “unit”: “ml”] 
      Response Params: "id":"123xyz", "serving":2, "difficulty": "m", "prep_time": 80, “ingredients”:  ["ingredient":”rice”, “amount”: “1/2”, “unit”: “g”, “index”:1,"ingredient":”water”, “amount”: “1/2”, “unit”: “ml”, “index”:2]  
    
    ) HTTP-Method: PATCH 
      EndPoint URL: /recipe/123xyz/steps/ 
      Request Params: ["description":”abc”, “image”: “s3//step1.png”, "index": 1,"description":”xyz”, “video”: “s3//step2.mp4”, "index": 2] 
      Response Params: "id":"123xyz", "serving":2, "difficulty": "m", "prep_time": 80, “ingredients”:["ingredient":”rice”, “amount”: “1/2”, “unit”: “g”, “index”:1,"ingredient":”water”, “amount”: “1/2”, “unit”: “ml”, “index”:2], 
"steps":["description":”abc”, “image”: “s3//step1.png”, "index": 1,"description":”xyz”, “video”: “s3//step2.mp4”, "index": 2]

这些是我可以通过以下问题想到的 API 细分。

) 如何处理配料和步骤的重新排序?

) 上传图片或视频时,先上传文件,获取s3的url,然后调用/recipe/123xyz/steps/api。或者与 /recipe/123xyz/steps/ API 调用一起上传文件?

如果我错了,请随时纠正我,并为此用例提出更好的 API 设计方法。

【问题讨论】:

问题相当广泛 @ReedJones 由于我是 BE 开发的新手,我正在尝试学习正确或有效的方法来处理这个用例。我不期待任何形式的实施。 【参考方案1】:

让我们试试吧!

如何处理配料和步骤的重新排序?

您的Ingredient 模型中需要有一个order_key 字段。随意将其设为PositiveSmallIntegerField

当您在需要的步骤中重新排序成分时,您需要向 API 后端发送请求,如下所示:

POST/steps/step_id/ingredients/reorder/


    "ingrediends": 
        "id_1": 1,
        "id_2": 2
    

在您的视图中处理此有效负载,并在获取数据时通过 order_key 字段重新排序您的查询集。

何时上传图片或视频...

在这里你可以有很多策略。 其中之一:

    您需要知道 CDN 的域(CloudFront + S3 Bucket)。例如mycdn.aws.com。在初始调用或成功验证、其他初始步骤中将其与系统信息一起发送到 Android 客户端。因此,您的应用可以识别 CDN 域。

    将您的文件上传到后端。如果您知道最终 URL 将保存在哪里,您就会知道最终 URL。例如:

文件名为uuid.avi CDN 域是mycdn.aws.com, 目标桶是video-files

所以你甚至不需要等待来自后端的东西 - 只需调用 https://mycdn.aws.com/video-files/uuid.avi上传后。

最好将某些内容作为单独的 API 调用上传到文件自己的端点。您将能够轻松管理此类请求(在文件错误或端点不工作等情况下显示用户错误消息)

另外,将文件上传到后端而不是直接从应用程序客户端将更受欢迎,因为如果发生更改,您不需要发布应用程序。有些东西会 100% 改变 ? 你需要分担责任 - 应用程序正在拍摄图像和视频,后端知道将所有这些员工保存在哪里。

【讨论】:

以上是关于如何为逐步连续上传用例制作 API 端点?的主要内容,如果未能解决你的问题,请参考以下文章

如何为命令行程序制作 gui?

Flutter:如何为 StreamBuilder 制作 http 流

如何为android应用程序制作worklight服务器

如何为自己的网站安装favicon.ico标志?

如何为所有 API 端点全局设置 http.ResponseWriter Content-Type 标头?

如何为下拉菜单制作 CSS 边框?