Python - HTTP-запросы

HTTP или протокол передачи гипертекста работает по модели клиент-сервер. Обычно веб-браузер является клиентом, а компьютер, на котором размещен веб-сайт, является сервером. В python мы используем модуль запросов для создания HTTP-запросов. Это очень мощный модуль, который может обрабатывать многие аспекты HTTP-связи, помимо простых данных запроса и ответа. Он может обрабатывать аутентификацию, сжатие / распаковку, запросы по фрагментам и т. Д.

HTTP-клиент отправляет HTTP-запрос на сервер в форме сообщения запроса, которое включает в себя следующий формат:

  • Строка запроса
  • Ноль или более полей заголовка (General | Request | Entity), за которыми следует CRLF
  • Пустая строка (т.е. строка, в которой ничего не предшествует CRLF), указывающая конец полей заголовка.
  • Необязательно тело сообщения

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

Строка запроса

Строка запроса начинается с токена метода, за которым следует Request-URI и версия протокола, и заканчивается CRLF. Элементы разделяются пробелами SP.

Request-Line = Method SP Request-URI SP HTTP-Version CRLF

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

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

Запрос method указывает метод, который будет выполняться на ресурсе, идентифицированном данным Request-URI. Этот метод чувствителен к регистру, и его всегда следует указывать в верхнем регистре. В следующей таблице перечислены все методы, поддерживаемые в HTTP / 1.1.

SN Метод и описание
1 GET

Метод GET используется для получения информации с заданного сервера с использованием заданного URI. Запросы, использующие GET, должны только извлекать данные и не должны иметь никакого другого влияния на данные.

2 HEAD

То же, что и GET, но передает только строку состояния и раздел заголовка.

3 POST

Запрос POST используется для отправки данных на сервер, например информации о клиенте, загрузки файлов и т. Д., С использованием HTML-форм.

4 PUT

Заменяет все текущие представления целевого ресурса загруженным контентом.

5 DELETE

Удаляет все текущие представления целевого ресурса, заданные URI.

6 CONNECT

Устанавливает туннель к серверу, идентифицированному заданным URI.

7 OPTIONS

Опишите варианты коммуникации для целевого ресурса.

8 TRACE

Выполняет обратный тест цикла сообщений вместе с путем к целевому ресурсу.

Request-URI

Request-URI - это универсальный идентификатор ресурса, который определяет ресурс, к которому следует применить запрос. Ниже приведены наиболее часто используемые формы для указания URI:

Request-URI = "*" | absoluteURI | abs_path | authority
 
SN Метод и описание
1 Звездочка *используется, когда HTTP-запрос применяется не к определенному ресурсу, а к самому серверу, и разрешен только в том случае, если используемый метод не обязательно применим к ресурсу. Например:

OPTIONS * HTTP/1.1

2 В absoluteURIиспользуется при отправке HTTP-запроса к прокси. Прокси-сервер запрашивается для пересылки запроса или службы из действительного кеша и возврата ответа. Например:

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

3 Наиболее распространенная форма Request-URI - это та, которая используется для идентификации ресурса на исходном сервере или шлюзе. Например, клиент, желающий получить ресурс непосредственно с исходного сервера, должен создать TCP-соединение с портом 80 хоста «www.w3.org» и отправить следующие строки:

GET /pub/WWW/TheProject.html HTTP/1.1

Host: www.w3.org

Обратите внимание, что абсолютный путь не может быть пустым; если в исходном URI ничего нет, он ДОЛЖЕН быть указан как «/» (корень сервера).

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

Мы будем использовать запросы модуля для изучения http-запроса.

pip install requests

В приведенном ниже примере мы видим случай простого запроса GET и распечатки результата ответа. Мы решили печатать только первые 300 символов.

# How to make http request
import requests as req
r = req.get('http://www.tutorialspoint.com/python/')
print(r.text)[0:300]

Когда мы запускаем указанную выше программу, мы получаем следующий результат -

<!DOCTYPE html>
<!--[if IE 8]><html class="ie ie8"> <![endif]-->
<!--[if IE 9]><html class="ie ie9"> <![endif]-->
<!--[if gt IE 9]><!-->	<html> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset="utf-8">
<title>Python Tutorial</title>
<meta name="description" content="Python Tutorial