Рубрики
Без рубрики

HTTP-запросы – Трудный путь с Netcat

Всю свою жизнь мы сталкивались с REST API с помощью библиотек и утилит, таких как curl и postman. Пришло время сделать это трудным путем с netcat, просто для удовольствия!

Автор оригинала: 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. Все, что передается в этом входном потоке, достигнет сервера через соединение. Давайте посмотрим, что произойдет, когда мы предоставим Это пример в качестве входных данных.

Плохой пример запроса с netcat

Данное входное сообщение не является допустимым HTTP-сообщением, поэтому сервер ответил кодом состояния 400 что означает Плохой запрос . А если вы внимательно понаблюдаете за логами сервера приложения flask, то увидите запись нашего последнего запроса.

Поскольку сервер является HTTP-сервером, то он понимает HTTP-запрос. Давайте создадим его, чтобы попасть в нашу открытую конечную точку API /hello .

Сообщение HTTP – запроса для этого запроса выглядит примерно так

GET /hello HTTP/1.1

И вы должны увидеть такой результат

Пример запроса GET с помощью netcat

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 с данными формы

Метод 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"}

Выход

Пример POST запроса с ДАННЫМИ JSON

Трудный путь к конечным точкам ОТДЫХА был совсем не трудным-оставаться любопытным и нырять глубоко.

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