Базовый веб-сервер, поддерживающий post+get (с использованием curl и netcat)

Вопрос или проблема

Извините, если название вопроса неясно относительно его цели.

Мне удалось создать веб-сервер только для ответов, используя только Bash; когда он получает POST-запрос curl, он возвращает результаты независимо от входных данных.

POST-запрос

curl -d '{"Name":"Lorem", "age":"34"}' -H "Content-Type: application/json" -X POST http://<ip>:8080/

Скрипт сервера (server.sh)

#!/bin/bash

while true; do
   echo -e "HTTP/1.1 200 OK\n\n<h1>Title</h1>$(date)" \
  | nc -l -k -p 8080 -q 1;
  nc -l -k -p 8080 -q 1 | cat - | grep -o '{...\+}';
done

В первый раз, когда я использую curl, он правильно возвращает HTTP/1.1 200 OK\n\n<h1>Title</h1>$(date), но не nc -l -k -p 8080 -q 1 | cat - | grep -o '{...\+}';, и curl завершается.

Во второй раз, используя curl, он не возвращает HTTP/1.1 200 OK\n\n<h1>Title</h1>$(date) и теперь возвращает результат nc -l -k -p 8080 -q 1 | cat - | grep -o '{...\+}';, и curl не завершается.

Идея заключается в том, чтобы обработать ввод от curl (используя nc -l -k -p 8080 -q 1 | cat - | grep -o '{...\+}'; + jq), но также отвечать и затем закрывать curl/соединение.

Вы можете сделать это с помощью сетевого инструмента, такого как socat. Сначала создайте простой скрипт “веб-сервер”; давайте назовем его web.sh:

#!/bin/sh

# Читаем (и игнорируем) инструкции от клиента
echo Receiving >&2
sed -E -e 's/\r$//' -e '/^$/q' -e 's/^/> /' >&2

# Ответ
echo Replying >&2
printf 'HTTP/1.1 200 OK\r\n\r\n<h1>Title</h1>%s\r\n' "$(date)"

# Готово
echo Done >&2

Сделайте его исполняемым и протестируйте локально с помощью ./web.sh. Вы можете закомментировать (или удалить) команды echo и заменить все >&2 на >/dev/null, если не хотите никаких лишних выходных данных.

Теперь привяжите его к прослушивающему порту,

socat TCP4-LISTEN:8080,fork,reuseaddr EXEC:./web.sh

Ответ или решение

Чтобы создать базовый веб-сервер, поддерживающий запросы POST и GET с использованием curl и netcat (или socat), важно правильно организовать обработку входящих данных и формирование ответов. В данном руководстве мы подробно рассмотрим, как добиться этого с помощью скрипта на Bash.

Зачем создавать веб-сервер?

Веб-серверы используются для обработки запросов от клиентов и возврата ответов. Ваша задача — создать простой сервер, который не только возвращает статический ответ, но и обрабатывает данные, отправленные клиентом. Это позволит вам тестировать API и изучать, как работают HTTP-запросы.

Настройка веб-сервера с использованием netcat

Предположим, у вас уже установлен netcat. Ниже приведен пример простого скрипта server.sh, который обрабатывает POST-запросы и возвращает ответ.

#!/bin/bash

while true; do
    { 
        echo -e "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n"; 
        read request
        echo "Received request: $request"
        echo '{"status":"success","message":"Data received successfully!"}'
        echo "Done"
    } | nc -l -p 8080
done

Объяснение кода

  1. Бесконечный цикл: Сервер будет работать постоянно, обрабатывая входящие соединения.
  2. Чтение запроса: Сервер читает запрос, который поступает через netcat.
  3. Формирование ответа: Ответ формируется с заголовком HTTP/1.1 200 OK и типом контента JSON. Также выводится сообщение о том, что запрос был успешно получен.
  4. Запуск сервера: Запустите скрипт командой bash server.sh. Теперь ваш сервер работает на порту 8080 и готов принимать HTTP-запросы.

Проверка работы сервера с использованием curl

Теперь вы можете протестировать сервер с помощью команды curl. Выполните следующее:

curl -d '{"Name":"Lorem", "age":"34"}' -H "Content-Type: application/json" -X POST http://<ip>:8080/

Использование socat для упрощения работы

Если вам нужно более надежное решение, рассмотрите использование socat, который может быть более удобным для работы с многоразовыми соединениями. Вот пример web.sh, реализованный с использованием socat:

#!/bin/sh

# Чтение (и игнорирование) инструкций от клиента
sed '1,/^\r$/d' | while read line; do
    echo "Received: $line"
done

# Ответ клиенту
printf 'HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{"status":"success","message":"Data received successfully!"}\r\n'

Запуск socat

Запустите следующий команд в терминале, чтобы связать socat с вашим скриптом:

socat TCP4-LISTEN:8080,fork EXEC:./web.sh

Заключение

Создание простого веб-сервера с поддержкой POST и GET запросов не так сложно, как может показаться. С помощью netcat или socat вы можете быстро реализовать сервер, обрабатывающий входящие запросы и отвечающий на них. Настройка такого сервера поможет вам глубже понять принципы работы HTTP и научиться тестировать и развивать API на практике.

Запомните, тестируя API и изучая HTTP-протокол, вы открываете новые горизонты возможностей для работы в области информационных технологий.

Оцените материал
Добавить комментарий

Капча загружается...