Python как получить ответ от сервера

Библиотека запросов Python

Библиотека запросов является стандартом де-факто для выполнения HTTP-запросов.

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

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

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

Из этого руководства вы узнаете, как:

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

В статье содержится вся информация, необходимая для понимания функций и представленных примеров.

Базовую информацию о том, как работают HTTP-запросы, можно найти на сайте w3schools.

Начало работы с требованиями

Начнем с установки библиотеки запросов. Для этого выполните в консоли следующую команду:

Если вы используете pipenv для управления пакетами python, запустите:

После установки библиотеки вы можете импортировать ее в свое приложение:

Теперь, когда все настроено, пора приступать к работе с библиотекой. Первая цель — научиться делать запросы GET.

GET

Запросы Методы HTTP, такие как GET и POST, определяют, какое действие вы пытаетесь выполнить при отправке запроса. Помимо GET и POST, есть и другие методы, которые мы будем использовать далее в этой статье.

Одним из наиболее распространенных методов HTTP является GET. Метод GET указывает, что вы пытаетесь получить из указанного ресурса. Чтобы сделать запрос GET, вызовите request.get() .
Чтобы проверить это, вы можете сделать запрос к Github API, вызвав get() со следующим URL-адресом:

Поздравляем! Вы подали свою первую заявку. Теперь давайте углубимся в ответ на этот запрос.

Объект ответа

Ответ — это объект для проверки результатов запроса.

Давайте сделаем тот же запрос, но на этот раз мы сохраним его в переменной, чтобы мы могли более подробно изучить его атрибуты и поведение:

В этом примере вы зафиксировали возвращаемое значение get() , который является экземпляром ответа, и сохранил его в переменной response . Имя переменной может быть любым.

Код ответа HTTP

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

Например, статус 200 OK означает, что ваш запрос был выполнен успешно, а статус 404 NOT FOUND означает, что ресурс не найден. Есть много других ответов от сервера, которые могут дать вам информацию о том, что произошло с вашим запросом.

Вы можете использовать .status_code, чтобы увидеть статус, возвращаемый сервером:

.status_code вернул 200 , что означает, что запрос выполнен успешно, и сервер предоставил запрошенные данные.

Иногда эта информация может использоваться в коде для принятия решений:

Если сервер возвращает 200, программа печатает Success , если ответ код 400, программа печатает Not Found .

Требования делают шаг вперед, чтобы упростить задачу. Если вы используете экземпляр Response в условном выражении, он оценивается как True, если код ответа находится между 200 и 400, и как False в противном случае.

Таким образом, вы можете упростить последний пример, перезаписав if :

Технические детали : Этот тест реального значения возможен, потому что __bool__() является перегруженным методом в Response.
Это означает, что поведение Response по умолчанию, учитывающее код состояния (ответ сервера) при определении фактического значения, было переопределено.

Обратите внимание, что этот метод не проверяет, равен ли код состояния 200.
Это связано с тем, что ответы с кодами в диапазоне от 200 до 400, например 204 НЕТ СОДЕРЖИМОГО и 304 НЕ ИЗМЕНЕНО, также считается верным. потому что они дают какой-то обработанный ответ.

Читайте также:  Выпей если сможешь как открыть

Например, статус 204 означает, что запрос был выполнен успешно, но в теле ответа нет содержимого.

Поэтому не забывайте использовать этот ярлык, только если вы хотите знать, был ли запрос успешным в целом. Затем правильно обработайте код состояния.

Если вы не хотите проверять код ответа сервера в операторе if, вы можете сгенерировать исключение, если запрос не выполнен. Это можно сделать, вызвав .raise_for_status() :

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

Дополнительная литература . Если вы не знакомы с f-строками в Python, я рекомендуем использовать их, так как это отличный способ упростить форматированные строки.

Теперь вы многое знаете о том, что делать с кодом ответа сервера. Но когда вы делаете запрос GET, вас редко интересует только ответ от сервера; обычно вы хотите увидеть больше.

Затем узнайте, как просмотреть фактические данные, отправленные сервером в теле ответа.

Содержание

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

Чтобы отобразить содержимое ответа в байтах, используйте .content:

, хотя .content дает вам доступ к необработанному байт части данных ответа, вы можете преобразовать их в строку, используя кодировку символов UTF-8. Ответ сделает это за вас, когда вы наберете .text :

Поскольку для декодирования из байтов в строки требуется схема кодирования, запросы попытаются угадать кодировку на основе заголовков ответа. Вы можете явно указать кодировку, установив .encoding перед .text :

Если вы посмотрите на ответ, вы увидите, что на самом деле это последовательный контент JSON. Чтобы получить словарь, вы можете взять строку, полученную из .text, и десериализовать ее с помощью .json_loads() . Более простой способ сделать это для достижения нужно использовать .json() .

Тип возвращаемого значения .json() — это словарь, поэтому вы можете получить доступ к значениям в объекте по ключу.

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

Заголовки

Заголовки ответа могут предоставить полезную информацию, такую ​​как тип ответа и время ожидания, для которого ответ должен быть кэширован.
Чтобы отобразить заголовки, введите .headers:

.headers возвращает объект, подобный словарю, который позволяет получить доступ к значениям объекта по ключу. Например, чтобы получить тип содержимого ответа, вы можете получить доступ к Content-Type:

Используйте ключ content-type или content-type, чтобы вернуть одно и то же значение.

Теперь вы изучил основы Response. Вы видели его наиболее часто используемые атрибуты и методы в действии. Давайте сделаем шаг назад и посмотрим, как меняются ответы, когда мы настраиваем запросы Get. URL-адрес. Для этого вы можете использовать get() для передачи параметров данных.

Передав <‘q’: ‘requests+language:python’> к параметру params в .get() , вы можете изменить результаты, возвращаемые поисковым API.
Вы можете передавать параметры в .get() как словарь, как вы уже делали, или как список кортежей:

Вы даже можете передавать значение в байтах:

Строковый запрос файлы полезны для параметризации запросов GET. Вы также можете настроить свои запросы, добавив или изменив отправляемые заголовки.

Заголовки запроса

Чтобы установить заголовки, передайте .get() словарь заголовков HTTP, используя параметр headers.
Например, вы можете отредактировать свой поисковый запрос выше, чтобы выделить релевантные результаты поиска, указав тип мультимедиа, который соответствует тексту в заголовке Accept:

Заголовок Accept сообщает серверу, какие типы контента поддерживает ваше приложение. может обрабатываться.

В этом случае вы используете значение заголовка application/vnd.github.v3.text-match+json, которое является настраиваемым заголовком принятия Github, в котором содержимое находится в формате JSON.

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

Другие методы HTTP

Помимо GET, существуют и другие популярные методы, включая: POST , УДАЛИТЬ, ПОСТАВИТЬ, ГОЛОВУ, ИСПРАВИТЬ и ОПЦИИ. Библиотека запросов предоставляет аналогичные функции для работы с каждым из перечисленных выше методов HTTP:

Читайте также:  Как можно открыть палатку

Каждый вызов функции отправляет запрос к службе httpbin с использованием соответствующего метода HTTP. Вы можете проверить ответ для каждого метода:

Заголовки, тело ответа, коды состояния и многое другое возвращаются в ответе для каждого метода. Затем узнайте о методах PUT, POST и PATCH и о том, чем они отличаются от других типов запросов.

Тело сообщения

Согласно спецификации HTTP, POST, PUT и менее распространенный PATCH метод передает тело сообщения с данными, а не параметры в строке запроса. При использовании этих запросов вы передаете полезную нагрузку параметру данных функции

. Данные принимают словарь, список кортежей, байты или файлоподобный объект.
Вы можете настроить данные, отправляемые в теле запроса, в соответствии с конкретными потребностями службы, с которой вы общаетесь.

Например, если тип содержимого вашего запроса — application/x- www-form-urlencoded , вы можете отправлять формы данных в виде словаря:

Вы также можете отправлять данные в виде списка кортежей:

Если вам нужно отправить данные в формате JSON, вы можно использовать параметр json. Когда вы передаете данные через json , Requests упорядочивает ваши данные и определяет для вас правильный заголовок типа контента.

httpbin.org — отличный ресурс, созданный по запросу. Это сервис, который принимает тестовые запросы и возвращает данные о запросе. Например, вы можете использовать его для проверки POST-запроса.

В ответе вы увидите, что сервер получил данные и заголовки из вашего запроса по мере его отправки. Запросы предоставляют вам эту информацию в виде подготовленного запроса.

Тестирование вашего запроса

Когда вы делаете запрос, библиотека запросов подготавливает данные перед их отправкой на сервер. Подготовка включает в себя такие вещи, как сериализация JSON и проверка заголовков.

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

Проверка PreparedRequest дает вам доступ ко всей информации о текущем запросе, такой как содержание, URL , заголовки, аутентификация и т. д.

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

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

Аутентификация помогает службам понять, кто вы. Обычно вы предоставляете свои учетные данные серверу, передавая данные через заголовок авторизации или настраиваемый заголовок, определенный службой.
Все функции запросов, которые вы видели ранее. На этом этапе укажите параметр аутентификации, который позволит вам передать свои учетные данные.

Примером API, требующего аутентификации, является GitHub Authenticated User API. Эта конечная точка предоставляет информацию о профиле аутентифицированного пользователя. Чтобы сделать запрос к API для аутентифицированных пользователей, вы можете передать свое имя пользователя и пароль в кортеже get() :

Запрос будет успешным, если учетные данные, которые вы передали в кортеже аутентификации, верны. Если вы попытаетесь сделать запрос без предоставления учетных данных, сервер ответит кодом состояния 401 Unauthorized.

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

Вам не нужно использовать HTTPBasicAuth, вы можете пройти аутентификацию другим способом. Запросы предоставляют дополнительные методы проверки подлинности из коробки, такие как HTTPDigestAuth и HTTPProxyAuth.
Вы даже можете использовать свой собственный механизм аутентификация. Для этого вам нужно создать подкласс AuthBase, а затем реализовать __call__() :

Здесь ваш собственный механизм TokenAuth получает токен, а затем включает его в заголовок X-TokenAuth вашего запроса.

Плохие механизмы аутентификации могут привести к ошибкам безопасности. Поэтому, если по какой-либо причине вашей службе не требуется собственный механизм аутентификации, лучше использовать готовую схему аутентификации, такую ​​как Basic или OAuth.

Пока вы думаете о безопасности, давайте возьмем ознакомьтесь с работой с сертификатами SSL в библиотеке запросов.

Проверка сертификата SSL

Безопасность важна каждый раз, когда вы отправляете или получаете данные. Вы взаимодействуете с защищенными сайтами через HTTP и устанавливаете зашифрованное соединение с использованием SSL, что означает, что проверка SSL-сертификата целевого сервера имеет решающее значение.

Читайте также:  Smolsies как получить все яйца

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

Если вы хотите отключить проверку SSL-сертификата, укажите False для проверки параметра запроса:

Библиотека запросов даже предупреждает вас, когда вы делаете небезопасный запрос для обеспечения безопасности ваших данных.

Производительность

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

Тайм-аут

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

По умолчанию запросы будут ждать неопределенное время, поэтому почти всегда следует указывать время ожидания. . Используйте параметр тайм-аута, чтобы установить тайм-аут. Тайм-аут может быть целым числом или числом с плавающей запятой, представляющим количество секунд ожидания ответа:

Время ожидания первого запроса истекает через одну секунду. На втором через 3,05 секунды.

Вы также можете передать кортеж в тайм-аут. Первый элемент кортежа — это время ожидания соединения (время, отведенное клиенту для установления соединения с сервером), а второй элемент — это время ожидания чтения. (время ожидания ответа после того, как клиент установит соединение). :

Если запрос устанавливает соединение в течение 2 секунд и получает данные в течение 5 секунд после установления соединения, будет возвращен ответ. По истечении времени ожидания функция выдает исключение Timeout:

Ваша программа может перехватить исключение и отреагировать соответствующим образом.

Объект сеанса

До сих пор вы имели дело с высокопроизводительными объектами. API-интерфейсы приложений уровня, такие как get() и post() . Эти функции являются абстракциями того, что происходит, когда вы указываете свои требования. Они скрывают детали реализации, такие как управление соединениями, поэтому вам не нужно о них беспокоиться.

Под этими абстракциями находится класс Session. Если вам нужно настроить, контролировать выполнение запросов и повысить производительность вашего приложения; ты можешь хотеть использовать экземпляр сеанса напрямую.

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

Каждый раз, когда вы делаете запрос в сеансе, после его инициализации с учетными данными для аутентификации, учетные данные будут

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

Максимальное количество попыток

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

Транспортные адаптеры позволяют определить набор конфигураций для каждой службы, с которой вы взаимодействуете. Например, вы хотите, чтобы все запросы к https://api.github.com повторялись три раза, прежде чем выдавать ошибку ConnectionError. Вам нужно создать транспортный адаптер, установить его параметр max_retries и подключить его к существующему сеансу:

Когда вы подключаете HTTPAdapter и github_adapter к сеансу, сеанс будет следовать этим настройкам при каждом запросе на https://. api.github .com.

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

Заключение

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

Теперь вы можете:

  • делать запросы, используя различные методы HTTP;
  • настроить ваши требования, изменив заголовок, тело сообщения и т.д.;
  • проверить данные, отправленные на сервер, и данные, полученные им в ответ;
  • проверить сертификат SSL;
  • Эффективно используйте запросы с max_retries , timeout , Session и транспортным адаптером.

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

Источник

Поделиться с друзьями
Решатор