Как сделать конечные точки 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
при получении данных.
Когда загружать изображение или видео...
Здесь вы можете использовать множество стратегий. Одна из них:
Вам необходимо знать домен вашей CDN (CloudFront + S3 Bucket). Например
.mycdn.aws.com
. Отправьте его вместе с системной информацией клиенту Android при начальных вызовах, или успешном аутентификации, других начальных шагах. Чтобы ваше приложение знало о домене CDN.Загрузите ваш файл на бэкэнд. Вы будете знать конечный URL, если знаете, где он будет сохранен. Например:
- имя файла -
uuid.avi
- домен CDN -
mycdn.aws.com
, - target bucket is
video-files
так что вам даже не нужно ждать чего-то от бэкенда - просто вызовите
https://mycdn.aws.com/video-files/uuid.avi
после загрузки.
Лучше загружать что-то в виде отдельного вызова API к собственной конечной точке файлов. Вы сможете легко управлять такими запросами (показывать пользователю сообщение об ошибке, если файл неверный или конечная точка не работает и т.д.)
Также загрузка файлов в бэкенд, а не напрямую из клиента приложения, будет более предпочтительной, потому что вам не нужно будет выпускать приложение, если что-то изменилось. Что-то будет изменено 100% 😀