

Ruby possède les utilitaires permettant d'effectuer des requêtes HTTP, toutefois la librairie Faraday en rend l'implémentation plus agréable.
URL du service de démonstration
require "bundler/inline"
gemfile do
source "http://rubygems.org"
gem "faraday"
end
require "faraday"
HOST = "https://cegep.jhoffman.ca"
BASE = "/ed-1/03_1-serveur-http/serveur_http_server.sinatra"
# response = Faraday.get("https://cegep.jhoffman.ca/ed-1/03_1-serveur-http/serveur_http_server.sinatra/")
# Correspond a l'URL complete ci-dessus
response = Faraday.get (HOST + BASE + "/")
p response
p response.body
# Si on reutilise le meme service pour plusieurs requetes
# on peut preparer une connexion reutilisable
connection = Faraday.new (HOST + BASE)
# ATTENTION si l'URL de base de la connexion contient un PATH.
# les requetes subsequentes avec un PATH ABSOLU, /..., le remplaceront
# "https://cegep.jhoffman.ca/about", pas le bonne url du service
# response = connection.get("/about")
# Il faut combiner le PATH de base manuellement a chaque fois
# "/ed-1/03_1-serveur-http/serveur_http_server.sinatra/about"
# response = connection.get(BASE + "/about")
# Sinon, on peut utiliser une URL RELATIVE, qui ne commence PAS par /
# "https://cegep.jhoffman.ca/ed-1/03_1-serveur-http/serveur_http_server.sinatra/about"
response = connection.get "about"
p response.body
# Utilisons des url relative pour la suite
# Avec un parametre dans la QUERY STRING
# GET
response = connection.get "greetings-query", { name: "james-query" }
p response.body
# POST
# Par default, form-urlencoded les Hash si post/put/patch
# https://lostisland.github.io/faraday/#/getting-started/quick-start?id=default-connection-default-adapter
puts "INVALIDE, le second parametre est le BODY et non QUERY"
response = connection.post "greetings-query", { name: "james-query-post" }
p response.body
# Pour post, patch, put, on configure manuellement les query params
response = connection.post "greetings-query" do |request|
request.params["name"] = "james-query-post" # Query param explicite
end
p response.body
# Avec un parametre dans le BODY
response = connection.post "greetings-body-form", { name: "james-body-form" }
p response.body
# Pour un body autre que form-urlencoded, on FAVORISE de preciser explicitement le Content-Type
# permets de beneficier des raccourcis des outils serveurs, comme Sinatra
response = connection.post "greetings-body", "james-body" #, { "content-type" => "text/plain" }
p response.body
#
# Interpreter une reponse JSON
#
# Tableau JSON
response = connection.get "response-array-json"
p response.body
array = JSON.parse response.body
p array
array.each do |v|
puts(v * 2)
end
#
# Objet JSON
#
response = connection.get "response-hash"
user = JSON.parse response.body
puts "Bonjour #{user["firstname"]} #{user["lastname"]}"
# Avec symboles
user = JSON.parse response.body, symbolize_names: true
puts "Bonjour #{user[:firstname]} #{user[:lastname]}"API
GET /
===
Hello from Sinatra!GET /about
===
This app doesn't do much...GET /greetings-query?name=...name...
===
Hello ...name...POST /greetings-query?name=...name...
===
Hello ...name...POST /greetings-body
...name...
===
Hello ...name...! GET /response-text
===
Texte brutGET /response-array
===
123GET /response-array-json
===
[1, 2, 3]GET /response-hash
===
{
"firstname": "James",
"lastname": "Hoffman"
}GET /response-file
===
...contenu du fichier...require "json"
#
# JSON est un format TEXTE typé:
# tableau, object, nombres, string, booléens, null
#
json_text = '{ "name": "james", "age": 22, "teacher": true }'
# Parse, interprète et transforme en VARIABLE typée
parsed_variable = JSON.parse json_text #, symbolize_names: true
# donne les clés en SYMBOLES
p parsed_variable
p parsed_variable.keys
#
# .to_json
# génère la représentation JSON en TEXTE d'une variable
#
data = [
"coucou",
1,
true,
{
email: "a@a.com",
pseudo: nil,
}
]
p data.to_json
#
# JSON.pretty_generate
# génére le TEXTE pour une mise en forme élégante,
# généralement visible à l'utilisateur
#
puts JSON.pretty_generate(data)
#
# Gérer les erreurs
# intercepter les Exceptions
#
maybe_json = JSON.parse 'not valid json' rescue nil
# maybe_json = JSON.parse '"not valid json"' rescue nil
# les valeurs primitives peuvent aussi être encodée en JSON
if maybe_json.nil?
puts "Invalide JSON"
else
puts "OK!"
puts JSON.pretty_generate(maybe_json)
end