La librairie Rack offre une interface modulaire et flexible pour la gestion du protocole HTTP via Ruby.
Nous utiliserons Sinatra qui fourni un emballage élégant aux primitives Rack.
require "bundler/inline"
gemfile do
source "http://rubygems.org"
gem "sinatra-contrib"
# -contrib contient plusieurs extensions pratiques
# https://sinatrarb.com/contrib/
gem "rackup"
gem "webrick"
end
require "sinatra/base"
require "sinatra/reloader"
class MySinatraApp < Sinatra::Base
configure :development do
register Sinatra::Reloader
end
# ...
run! if app_file == $0
end
L'affichage à la console apparaîtra dans la fenêtre d'exécution du serveur.
http://{HOST}:4567
ruby server.rb
ss -tlnp4
# Pour voir les connexions actives: adresse, port, processus
# https://man7.org/linux/man-pages/man8/ss.8.html
# Un seul processus pour un port peut exister à la fois
# pour terminer un processus existant via le pid
kill -9 {PID}
class MySinatraApp < Sinatra::Base
# https://sinatrarb.com/intro.html#available-settings
set :port, 9876
set :bind, "0.0.0.0"
# ...
end
require "bundler/inline"
gemfile do
source "http://rubygems.org"
gem "sinatra-contrib"
gem "webrick"
gem "rackup"
end
require 'sinatra/base'
require 'sinatra/reloader'
class ServeurHttpServer < Sinatra::Base
configure :development do
register Sinatra::Reloader
end
#
# REQUETES
#
# Chaque URL accessible dans l'application est une ROUTE
get "/" do
"Hello from Sinatra!"
end
get "/about" do
"This app doesn't do much..."
end
# On peut recevoir des parametres
# Dans la QUERY STRING
# GET ou POST /greetings-query?name=james
get "/greetings-query" do
# VS name = params["name"]
name = request.env["rack.request.query_hash"]["name"]
"Hello #{name}!"
end
post "/greetings-query" do
# VS name = params["name"]
name = request.env["rack.request.query_hash"]["name"]
"Hello #{name}!"
end
# Dans le BODY
# POST /greetings-body
post "/greetings-body" do
name = request.body.read
"Hello #{name}!"
end
#
# REPONSES
# GET ou POST
#
# On doit retourner une String ou un item Enumerable
# qui renvoie uniquement des string
get "/response-text" do
"Texte brut"
end
get "/response-array" do
# ["1", "2", "3"]
[1, 2, 3].map do |v|
v.to_s
end
end
# Le JSON est tres flexible
# pour representer des données complexes
# en format texte
get "/response-array-json" do
[1, 2, 3].to_json
end
get "/response-hash" do
# Version longue
# {
# "firstname" => "James",
# "lastname" => "Hoffman"
# }.to_json
{
firstname: "James",
lastname: "Hoffman"
}.to_json
end
get "/response-file" do
send_file File.join(__dir__, "data.txt")
end
run! if app_file == $0
end