Échange de données 1

Requête
Réponse

Sinatra

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.

Inclure la librairie

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

Démarrer le serveur

L'affichage à la console apparaîtra dans la fenêtre d'exécution du serveur.

  • Le serveur est disponible à http://{HOST}:4567
bash
ruby server.rb

Gestion des processus

bash
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}

Personnaliser les paramètres du serveur

class MySinatraApp < Sinatra::Base

# https://sinatrarb.com/intro.html#available-settings
set :port, 9876
set :bind, "0.0.0.0"

# ...

end

Routes

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