Как сделать конечные точки API для случая использования пошаговой непрерывной загрузки?

У меня есть хороший опыт работы с Android Frontend REST API вызовов, но я очень новичок в Backend и изучении Django Framework, поэтому мне нужна помощь в разработке следующих конечных точек 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, которые я могу придумать для вопросов ниже.

) Как обрабатывать изменение порядка следования ингредиентов и шагов?

) Когда нужно загрузить изображение или видео, сначала загрузите файл и получите url из s3, а затем сделайте /recipe/123xyz/steps/ api вызов. Или загрузить файл вместе с /recipe/123xyz/steps/ API вызовом?

Поправьте меня, если я ошибаюсь, и предложите лучший подход к проектированию API для этого случая использования.

Давайте попробуем!

Как обрабатывать изменение порядка ингредиентов и шагов?

Вам необходимо иметь order_key поле в вашей Ingredient модели. Не стесняйтесь сделать его в виде PositiveSmallIntegerField

Когда вы хотите изменить порядок ингредиентов на нужном этапе, вам нужно отправить запрос на бэкэнд API примерно следующего содержания:

POST /steps/{step_id}/ingredients/reorder/

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

Обработайте эту полезную нагрузку в своем представлении и перестройте свой набор запросов по полю order_key при получении данных.

Когда загружать изображение или видео...

Здесь вы можете использовать множество стратегий. Одна из них:

  1. Вам необходимо знать домен вашей CDN (CloudFront + S3 Bucket). Например mycdn.aws.com. Отправьте его вместе с системной информацией клиенту Android при начальных вызовах, или успешном аутентификации, других начальных шагах. Чтобы ваше приложение знало о домене CDN.

    .
  2. Загрузите ваш файл на бэкэнд. Вы будете знать конечный URL, если знаете, где он будет сохранен. Например:

  • имя файла - uuid.avi
  • домен CDN - mycdn.aws.com,
  • target bucket is video-files

так что вам даже не нужно ждать чего-то от бэкенда - просто вызовите https://mycdn.aws.com/video-files/uuid.avi после загрузки.

Лучше загружать что-то в виде отдельного вызова API к собственной конечной точке файлов. Вы сможете легко управлять такими запросами (показывать пользователю сообщение об ошибке, если файл неверный или конечная точка не работает и т.д.)

Также загрузка файлов в бэкенд, а не напрямую из клиента приложения, будет более предпочтительной, потому что вам не нужно будет выпускать приложение, если что-то изменилось. Что-то будет изменено 100% 😀

Вернуться на верх