Автор оригинала: Arpit Bhayani.
Большая часть трафика через Интернет-это HTTP-трафик. Существует HTTP-клиент, который хочет получить некоторые данные от HTTP-сервера, поэтому он создает сообщение HTTP-запроса в протоколе, понятном серверу, и отправляет его. Сервер читает сообщение, понимает его, действует соответственно и отвечает HTTP-ответом.
Этот полный процесс абстрагируется инструментами типа curl , запросами библиотек и утилит типа Postman . Вместо того чтобы использовать эти инструменты и утилиты, мы пройдем трудный путь и увидим HTTP-сообщения в действии.
Для целей эксперимента давайте создадим очень простой веб-сервер в Python Flask framework, который предоставляет тривиальную конечную точку Hello World.
Скрипт веб-сервера Python
from flask import Flask app = Flask(__name__) @app.route('/hello') def hello(): return "Hello, World!" app.run(port=3000)
Требования к установке
pip install flask
Запустите веб-сервер
python hello.py
Сервер прослушивает порт 3000 . Если вы нажмете из браузера http://localhost:3000/hello , ты бы видел Здравствуй, Мир! рендеринг.
HTTP-клиент общается с HTTP-сервером по общему протоколу, понятному обеим сторонам. Пример сообщения HTTP – запроса выглядит примерно так
GET /hello.html HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.sample-server.com Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive
Чтобы узнать больше о сообщениях HTTP-запросов, см. Ссылки в конце этой статьи.
HTTP-связь происходит по TCP – соединению. Поэтому мы создаем TCP-соединение с сервером и пытаемся получить от него ответ. Чтобы получить TCP – соединение, я буду использовать netcat .
netcat – это утилита, которая используется практически для всего, что связано с TCP или UDP. Он может открывать TCP-соединения, отправлять UDP-пакеты, прослушивать произвольные TCP-и UDP-порты, выполнять сканирование портов и работать как с IPv4, так и с IPv6.
Веб-сервер, который был создан выше, прослушивает порт 3000 . Давайте создадим TCP-соединение и подключимся к нему с помощью netcat .
netcat localhost 3000
Эта команда наряду с созданием TCP-соединения также откроет STDIN. Все, что передается в этом входном потоке, достигнет сервера через соединение. Давайте посмотрим, что произойдет, когда мы предоставим Это пример в качестве входных данных.
Данное входное сообщение не является допустимым HTTP-сообщением, поэтому сервер ответил кодом состояния 400 что означает Плохой запрос . А если вы внимательно понаблюдаете за логами сервера приложения flask, то увидите запись нашего последнего запроса.
Поскольку сервер является HTTP-сервером, то он понимает HTTP-запрос. Давайте создадим его, чтобы попасть в нашу открытую конечную точку API /hello .
Сообщение HTTP – запроса для этого запроса выглядит примерно так
GET /hello HTTP/1.1
И вы должны увидеть такой результат
HTTP-сервер понимает сообщение, отправленное клиентом, и отвечает в соответствии с указаниями исходного кода.
Метод GET с параметрами запроса и заголовками
Следующий метод предоставляет конечную точку , которая принимает параметр query named name и возвращает ответ с name в нем.
from flask import request @app.route('/user') def get_user(): name = request.args.get('name') return "Requested for name = %s" % name
Сообщение HTTP – запроса
Предоставьте сообщение HTTP-запроса ниже, когда STDIN откроется после выполнения команды netcat и подключения к серверу.
GET /user?name=arpit HTTP/1.1
Выход
Пример базового метода POST
Следующий метод принимает данные формы через метод HTTP POST и возвращает фиктивный ответ с username и password в нем.
from flask import request @app.route('/login', methods=['POST']) def login(): username = request.form.get('username') password = request.form.get('password') return "Login successful for %s:%s" % (username, password)
Сообщение HTTP – запроса
Предоставьте сообщение HTTP-запроса ниже, когда STDIN откроется после выполнения команды netcat и подключения к серверу.
POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 32 username=arpit&password=welcome
Выход
Метод POST с телом запроса JSON
Следующий метод принимает данные JSON, содержащие поле id с целочисленным значением через метод HTTP POST, и возвращает фиктивный ответ с id в нем.
from flask import request @app.route('/save', methods=['POST']) def save_user(): user_data = request.json return 'Saving user with id = %d' % (user_data.get('id'))
Сообщение HTTP – запроса
Предоставьте сообщение HTTP-запроса ниже, когда STDIN откроется после выполнения команды netcat и подключения к серверу.
POST /save HTTP/1.1 Content-Type: application/json Content-Length: 30 {"id": 1092, "name": "Arpit"}
Выход
Трудный путь к конечным точкам ОТДЫХА был совсем не трудным-оставаться любопытным и нырять глубоко.
Эта статья была первоначально опубликована в моем блоге здесь .