От внешнего интерфейса к серверному с помощью FastAPI

Создано DALL-E-3

Создано DALL-E-3

Что такое API простым языком?

Представьте, что вы в ресторане и вам очень хочется вкусной еды. Вы садитесь за столик и с нетерпением ждете меню. В этом сценарии меню похоже на API (интерфейс прикладного программирования).

  1. Меню как API . Меню — это ваш интерфейс к кухне ресторана. Он не раскрывает вам секреты кухни, но представляет блюда, которые вы можете заказать, и информацию, необходимую для выбора.

  2. Заказ : Когда вы определитесь, что хотите, вам не нужно идти на кухню и готовить еду самостоятельно. Вместо этого вы сообщаете о своем выборе официанту (посреднику), который передает ваш запрос на кухню.

пример аналогии того, как работают API

пример аналогии того, как работают API

  • Клиент : представляет программное обеспечение или приложение, которое хочет запросить информацию или услуги.

  • Официант : действует как посредник, аналогичный API, который принимает запрос клиента и передает его в ресторан (на кухню).

  • Ресторан (кухня): представляет систему или приложение, содержащее данные или услуги, необходимые клиенту.

В этой аналогии клиент (программное обеспечение) взаимодействует с официантом (API), чтобы запросить конкретную услугу (блюдо) у ресторана (системы). Запрос API аналогичен оформлению заказа, а ответ API — получению взамен готового блюда (данных или услуги).

Где используются API?

Давайте рассмотрим некоторые простые и удобные для новичков варианты использования API. Эти примеры помогут вам понять, как API обычно используются в повседневных сценариях:

  1. Информация о погоде . Представьте, что вы используете приложение погоды на своем телефоне. Приложение само не генерирует данные о погоде;  вместо этого он получает информацию о погоде из API метеорологической службы. Этот API предоставляет обновления погоды в режиме реального времени, которые отображает приложение.

  2. Направления на карте . Когда вы перемещаетесь с помощью картографического приложения, такого как Google Maps, оно использует API для получения направлений и данных о трафике в реальном времени. Вы вводите пункт назначения, и приложение запрашивает API, чтобы рассчитать лучший для вас маршрут.

  3. Публикация в социальных сетях . Делились ли вы когда-нибудь новостной статьей или фотографией в социальных сетях?  Эти платформы часто позволяют сторонним приложениям подключаться через API. Когда вы делитесь чем-то из приложения, оно связывается с API платформы социальных сетей, чтобы опубликовать ваш контент.

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

Использование API

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

URL -адрес REST API , который мы используем для этого примера:

https://api.sampleapis.com/coffee/hot

Объяснение компонентов:

  1. Клиент : клиент, которым может быть веб-браузер или мобильное приложение, инициирует процесс, отправляя HTTP-запрос в API.

  2. Сервер : сервер размещает API, получает запрос клиента и обрабатывает его.

  3. API : Это ядро ​​процесса. Он получает запрос клиента и служит посредником между клиентом и базой данных.

  4. База данных : в базе данных хранятся данные, необходимые API для выполнения запроса. В этом случае он содержит информацию о разных видах кофе.

отношение клиент-сервер-база данных

отношение клиент-сервер-база данных

Поток данных:

  1. HTTP-запрос GET клиента отправляется на сервер.

  2. Сервер пересылает запрос API.

  3. API обрабатывает запрос, включая идентификацию конечной точки, и запрашивает базу данных.

  4. База данных отвечает API запрошенными данными.

  5. API отправляет HTTP-ответ обратно клиенту с данными.

Понимание URL-адреса

fac525fdd48bda5c6a900ea8f37e3231.png

Давайте разберем URL-адрес » https://api.sampleapis.com/coffee/hot » шаг за шагом:

  1. Протокол (https) : здесь указывается протокол, используемый для связи, в данном случае это » https », что указывает на безопасное HTTP-соединение. Это гарантирует, что данные, передаваемые между клиентом и сервером, зашифрованы в целях безопасности.

  2. Домен ( api.sampleapis.com ) : Домен — это адрес сервера, на котором размещен API. В этом URL-адресе » api.sampleapis.com » является доменом. Это похоже на почтовый адрес сервера в Интернете.

  3. Путь ( /coffee/hot ) : Путь — это конкретный маршрут или местоположение на сервере, где размещен API. В нашем URL-адресе » /coffee/hot » — это путь. Это похоже на переход к определенной папке или каталогу на компьютере.

  4. Конечная точка API : полный URL-адрес, включая домен и путь, указывает уникальную конечную точку API. Это конкретное место, где API будет отвечать на запросы. В данном случае » https://api.sampleapis.com/coffee/hot » является конечной точкой.

Итак, когда клиент (например, веб-браузер или приложение) хочет взаимодействовать с этим API, он формирует запрос с этим URL-адресом, указывая протокол, домен и конечную точку. В этом примере это все равно, что сказать браузеру перейти на определенный безопасный адрес ( https://api.sampleapis.com ) и запросить информацию, связанную с » горячим кофе » (конечная точка). Сервер, на котором размещен API, обрабатывает этот запрос и предоставляет в ответ соответствующие данные.

Понимание HTTP-запросов и ответов

HTTP означает протокол передачи гипертекста , который является основой передачи данных во Всемирной паутине.

  • HTTP-запрос — это сообщение, отправленное клиентом (например, веб-браузером, мобильным приложением или любым программным обеспечением) для запроса информации с сервера.

  • Он состоит из запросов и ответов . Запрос — это данные, необходимые для выполнения вызова API, а ответ — это данные, которые вы получаете взамен.

HTTP-запросы

Он состоит из нескольких частей:

Метод запроса :

Это определяет действие, которое клиент хочет, чтобы сервер выполнил. Общие методы включают в себя:

1. GET-запрос:

  • Метод GET используется для получения данных из указанного ресурса.

  • Это запрос только для чтения , то есть он не изменяет данные на сервере.

  • Обычно используется в веб-браузерах при посещении веб-сайта, поскольку он запрашивает веб-страницы и ресурсы (изображения, стили, скрипты).

  • Запросы GET не должны иметь тела запроса и обычно кэшируются браузерами для более быстрого поиска.

2. POST-запрос:

  • Метод POST используется для отправки данных для обработки в указанный ресурс.

  • Он часто создает новый ресурс на сервере или выполняет такое действие, как отправка формы или выполнение транзакции.

  • POST-запросы могут иметь тело запроса, содержащее данные для обработки сервером.

3. PUT-запрос:

  • Метод PUT используется для обновления или замены существующего ресурса или создания нового ресурса, если он не существует.

  • Он идемпотентный , то есть повторяющиеся запросы будут иметь один и тот же результат, гарантируя, что выполнение нескольких одинаковых запросов не приведет к неожиданному поведению.

  • Запрос PUT обычно требует отправки всего представления ресурса для обновления. Это означает, что если вы хотите обновить одно поле, вам необходимо отправить весь ресурс с модификацией.

4. УДАЛИТЬ запрос:

  • Метод DELETE используется для запроса удаления указанного ресурса .

  • Он удаляет ресурс и связанные с ним данные с сервера.

  • Запросы DELETE обычно не имеют тела запроса .

5. Запрос ИСПРАВЛЕНИЯ:

  • Метод PATCH используется для внесения частичных изменений в ресурс.

  • Он часто используется, когда вы хотите обновить только определенные поля или атрибуты ресурса, не затрагивая весь ресурс.

  • Запросы PATCH требуют тела запроса, в котором указываются изменения, которые необходимо внести.

Разница между PUT и PATCH :

Основное различие заключается в том, как они обрабатывают обновления:

  • PUT : Заменяет весь ресурс новым представлением . Если вы опустите поле в новом представлении, оно часто интерпретируется как пустое или нулевое, что потенциально может перезаписать существующие данные. Он не очень подходит для частичных обновлений.

  • ИСПРАВЛЕНИЕ : обновляет определенные поля ресурса . Вы отправляете только те изменения, которые хотите применить, что делает возможным частичное обновление, не затрагивая другие поля. Это более эффективно, когда вам нужно внести небольшие изменения.

URL-адрес :

Это адрес ресурса или конечной точки API, с которой клиент хочет взаимодействовать.

Заголовки :

Они предоставляют дополнительную информацию о запросе, например тип данных, которые клиент может принять, или учетные данные аутентификации.

Тело :

Для таких методов, как POST и PUT, тело содержит данные, которые клиент хочет отправить на сервер, часто в формате JSON.

запросы на импорт # Определите URL-адрес конечной точки API url = "https://api.sampleapis.com/coffee/hot" # Отправьте ответ на запрос HTTP GET = Requests.get(url) # Проверьте, был ли запрос успешным (код состояния 200) ) if response.status_code == 200 :     data = response.json()     print ( "Данные получены:" )     print (data) else :     print ( f"Запрос не выполнен с кодом состояния: {response.status_code} " )

HTTP-ответы

HTTP-ответ — это сообщение, отправленное сервером клиенту в ответ на HTTP-запрос.

Он также состоит из нескольких частей:

1. Коды состояния

Это трехзначное число , обозначающее результат запроса. Общие коды состояния включают в себя:

  • 200 OK:  запрос прошел успешно, и сервер отправляет запрошенные данные.

  • 201 Created:  запрос выполнен успешно, и сервер создал новый ресурс.

  • 400 Неверный запрос:  запрос был неверным или недействительным.

  • 404 Not Found:  запрошенный ресурс не найден на сервере.

  • 500 Внутренняя ошибка сервера:  при обработке запроса на сервере произошла ошибка.

    4fff54fb033639edb6f455752cbd1211.png

    2. Заголовки:

    Подобно заголовкам запроса, они предоставляют дополнительную информацию об ответе, например тип отправляемых данных или информацию о сервере.

    3. Тело:

    Он содержит данные или контент, отправленные сервером в ответ на запрос клиента. Данные могут быть в различных форматах, таких как HT ML, JSON, XML или обычный текст.

    [ 
        { 
            "title" :  "Black" , 
            "description" :  "Черный кофе – это очень просто: молотые кофейные зерна завариваются в горячей воде и подаются теплыми. И если вы хотите, чтобы это звучало необычно, вы можете назвать черный кофе по его названию. имя собственное: кафе нуар». , 
            «img» :  [ 
                «coffe» 
            ] , 
            «img» :  «https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/A_small_cup_of_coffee.JPG/640px-A_small_cup_of_coffee.JPG» , 
            «id» :  1 
        } , 
        { 
            "title" :  "Латте" , 
            "description" :  "Как самый популярный кофейный напиток, латте состоит из порции эспрессо и вспененного молока с небольшим количеством пенки. Его можно заказать. простой или с добавлением чего-либо, от ванили до тыквенных специй». , 
            «img» :  [ 
                "Espresso" , 
                "Wareed Milk" 
            ] , 
            "Image" :  "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/latte_at_doppio_ristretto_chiang_maumb_01.jpg/509px-latte_ristretto_chiang_mabi_01. .jpg " , 
            "id" :  2 
        } ,
         ... 
    ]

    FastAPI: современная платформа Python для создания API

    FastAPI — это передовая веб-инфраструктура Python, предназначенная для быстрого и простого создания API. Он приобрел значительную популярность в сообществе разработчиков благодаря своим исключительным функциям и преимуществам. Давайте подробнее рассмотрим, что отличает FastAPI:

    Автоматическая документация:

    FastAPI упрощает разработку API, автоматически создавая интерактивную и удобную для пользователя документацию. Это означает, что вам не нужно отдельно документировать конечные точки API. Это удобная для разработчиков функция, которая упрощает совместную работу и интеграцию.

    Типовая безопасность и проверка:

    FastAPI использует подсказки типов Python для обеспечения безопасности типов при разработке API. Это не только помогает обнаружить ошибки на ранней стадии, но и помогает автоматически генерировать точные схемы API. Вы получаете проверку и сериализацию данных запросов и ответов без необходимости использования дополнительного кода.

    Асинхронная поддержка:

    FastAPI полностью поддерживает асинхронное программирование, что меняет правила игры для высокопроизводительных API. Вы можете создавать асинхронные маршруты, использовать Python asyncи awaitэффективно обрабатывать одновременные запросы.

Монтаж:

  • Сначала убедитесь, что в вашей системе установлен Python.

  • Установите FastAPI и Uvicorn, облегченный сервер ASGI, используя pip:

pip insatll fastapi uvicorn

Настройка кода:

  • Создайте новый файл Python (например,  main.py) для написания приложения FastAPI.

  • Импортируйте класс FastAPI из fastapiмодуля:

from fastapi import 
FastAPI = FastAPI() 

Определите конечные точки:

  • Определите конечные точки API с помощью декораторов FastAPI.

  • Добавьте маршруты в свое приложение с помощью функций. Например:

@app.get( "/" ) 
def  read_root (): 
    return { "Hello" : "World" }

Запустите ваше приложение:

uvicorn main :app --reload

Здесь mainотносится к имени вашего файла Python (без расширения .py ) и appпредставляет собой созданный вами экземпляр FastAPI.

Доступ к вашему API:

  • Ваше приложение FastAPI будет доступно http://localhost:8000по умолчанию.

  • Вы можете использовать такие инструменты curl, как веб-браузер, для доступа к определенным конечным точкам.

Доступ к пользовательскому интерфейсу Swagger

0fdf5d6bf6b77a871c2a6e957ae1bf70.png

Swagger UI — это мощная встроенная функция FastAPI, которая упрощает документацию API. Получив доступ localhost:8000/docsк своему приложению FastAPI, вы обнаружите интерактивный веб-интерфейс, который предоставляет подробную информацию о конечных точках вашего API. С помощью пользовательского интерфейса Swagger вы можете исследовать и тестировать свой API, что упрощает понимание возможностей вашего API и взаимодействие с ними.

b226551254c09635ed2125485e9df01f.png073fa14114853ad61af6f68cb49b126b.png213c3be57cf78154050b36d884f36930.png

Архитектура MVC (модель-представление-контроллер)

5635dccd7e06643f4d6a49f933180576.png

MVC — это популярный архитектурный шаблон программного обеспечения, используемый для организации кода в приложениях, особенно в веб-приложениях и приложениях для настольных компьютеров. Он разделяет приложение на три взаимосвязанных компонента:

Модель (Данные):

  • Модель представляет данные и бизнес-логику приложения.

  • Он управляет и поддерживает состояние и поведение приложения.

  • Он отвечает за хранение, поиск, проверку и манипулирование данными.

  • Изменения в модели напрямую влияют на представление.

Просмотр (презентация):

  • Представление отвечает за представление данных пользователю.

  • Он имеет дело с пользовательским интерфейсом, включая такие элементы, как кнопки, формы и графические компоненты.

  • Представление не обрабатывает данные напрямую, а получает их от модели.

  • Он отвечает за отображение данных и реагирование на действия пользователя.

Контроллер (Логика):

  • Контроллер действует как посредник между Моделью и Представлением.

  • Он получает пользовательский ввод и преобразует его в действия для модели или представления.

  • Он содержит логику приложения, включая способы обработки и представления данных.

  • Он обновляет модель на основе взаимодействия с пользователем и может запускать обновления в представлении.

Тестирование API

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

  1. cURL : Этот инструмент командной строки представляет собой швейцарский армейский нож разработчика для выполнения HTTP-запросов для тестирования API. С помощью cURL вы можете отправлять G ET, POST, PUT, DELETE и другие запросы для взаимодействия с вашим API непосредственно из терминала. Это легкий и универсальный инструмент для быстрого тестирования и отладки API.

    ece93ca5cbe4f45079a0db949b724ec9.png

    2. Postman : Postman — это удобный инструмент тестирования API с графическим интерфейсом. Он позволяет создавать и организовывать запросы API, управлять средами и автоматизировать тестирование. Postman особенно полезен для тестирования сложных рабочих процессов, API с аутентификацией, а также для обмена тестовыми коллекциями с членами команды.

  2. c3b0454371117cec3a3bcc91c1f8ddfa.png

    И cURL, и Postman удовлетворяют разные потребности: cURL отлично подходит для быстрых тестов и написания сценариев, а Postman предоставляет комплексную среду для углубленного тестирования API и совместной работы. Выбор между ними часто зависит от сложности ваших требований к тестированию и предпочтительного рабочего процесса.

    Безопасность в API

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

    Аутентификация:

    • Аутентификация — это процесс проверки личности пользователей или систем, взаимодействующих с вашим API.

    • Общие методы аутентификации включают ключи API ,  токены (например, веб-токены JSON или токены OAuth) и базовую аутентификацию .

    • Эффективная аутентификация гарантирует, что только авторизованные пользователи или системы смогут получить доступ к вашему API.

    Авторизация:

    • Авторизация выходит за рамки аутентификации и определяет, какие действия разрешено выполнять пользователям или системам после получения доступа.

    • Управление доступом на основе ролей (RBAC) и разрешения часто используются для управления тем, кто может читать, записывать или изменять данные через ваш API.

    • Правильная авторизация гарантирует, что пользователи имеют правильный уровень доступа, не выходя за его границы.

    Ограничение скорости:

    • Ограничение скорости помогает предотвратить злоупотребление вашим API, ограничивая количество запросов, которые пользователь или система могут сделать в течение определенного периода времени.

    • Это крайне важно для защиты вашего API от распределенных атак типа «отказ в обслуживании» (DDoS) и обеспечения справедливого использования.

    • Ограничения скорости могут быть определены на основе IP-адресов, учетных записей пользователей или ключей API.

    HTTPS и шифрование:

    • Чтобы защитить данные при передаче, всегда используйте HTTPS для шифрования связи между клиентами и вашим API.

    • Шифрование гарантирует, что данные, которыми обмениваются клиент и сервер, остаются конфиденциальными и безопасными .

    Проверка ввода и очистка:

    • Проверяйте и очищайте входные данные для предотвращения атак путем внедрения, таких как внедрение SQL и межсайтовый скриптинг (XSS).

    • Это гарантирует, что вредоносные данные не смогут поставить под угрозу целостность вашего API или вашей базы данных.

    Рекомендации по обеспечению безопасности API:

    • Следуйте общепринятым рекомендациям по обеспечению безопасности API, например обновляйте программное обеспечение и библиотеки для устранения известных уязвимостей.

    • Внедрите правильную обработку ошибок, чтобы избежать утечки конфиденциальной информации в ответах об ошибках.

    • Защитите себя от атак грубой силы, внедрив механизмы блокировки учетной записи.

    Регулирование и мониторинг:

    • Внедрите решения для мониторинга, чтобы следить за производительностью и безопасностью вашего API.

    • Настройте автоматические оповещения для обнаружения необычной активности и реагирования на нее.

    • Внедрите регулирование, чтобы ограничить количество запросов от одного клиента за короткий период, что может помочь уменьшить злоупотребления и защитить ваши ресурсы.

    Будущее API

    Ландшафт API готов к трансформации: передовые технологии, такие как gRPC ,  WebSockets и GraphQL , меняют обмен данными. Заглядывая в будущее, ожидаем:

    • Эффективность благодаря gRPC . Высокопроизводительные возможности gRPC произведут революцию в архитектуре коммуникаций в реальном времени и микросервисов.

    • Работа в реальном времени : WebSockets обеспечит беспрецедентную интерактивность в реальном времени для приложений, от игр до инструментов для совместной работы.

    • Гибкий доступ к данным : GraphQL позволит клиентам запрашивать только те данные, которые им нужны, повышая эффективность API и удобство работы пользователей.

Дальнейшее чтение и ссылки

Вот некоторые ссылки и дополнительные материалы для чтения по различным аспектам, связанным с API:

Основы API:

  1. Википедия: Интерфейс прикладного программирования (API) — подробный обзор API.

  2. Веб-документы MDN: что такое API? — Объяснение API для начинающих.

RESTful API:

  1. Диссертация Роя Филдинга по REST — оригинальная диссертация Роя Филдинга, создателя REST, объясняющая принципы архитектуры RESTful.

гРПК:

  1. Официальная документация gRPC — официальная документация по gRPC, включая учебные пособия и примеры.

  2. gRPC: Up and Running — Книга Касуна Индрасири и Данеша Куруппу — Полное руководство по gRPC.

Вебсокеты:

  1. MDN WebSockets API — Подробный справочник по использованию WebSockets в веб-разработке.

  2. WebSocket.org — центральный ресурс информации, связанной с WebSocket.

ГрафQL:

  1. Официальная документация GraphQL — отличная отправная точка для понимания GraphQL и того, как его использовать.

  2. How To GraphQL — комплексный ресурс с учебными пособиями и примерами для изучения GraphQL.

Безопасность API:

  1. Десять крупнейших угроз безопасности API OWASP — список десяти крупнейших угроз безопасности API и рекомендации по их устранению.

  2. Рекомендации по обеспечению безопасности API. Руководство по передовым методам обеспечения безопасности API.

Бессерверные API:

  1. Документация AWS Lambda — официальная документация AWS Lambda, популярной бессерверной платформы.

  2. Cloudflare Workers® — мгновенно развертывайте бессерверный код по всему миру, чтобы обеспечить ему исключительную производительность, надежность и масштабируемость.

© Habrahabr.ru