Échange de données 1

Échange de données 1


2.1 - Service web

2.2 - Client HTTP

2.3 - Exercices
Requête
Réponse

Faraday

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

rb
copier
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

http
GET /

===

Hello from Sinatra!
http
GET /about

===

This app doesn't do much...
http
GET /greetings-query?name=...name...

===

Hello ...name...
http
POST /greetings-query?name=...name...

===

Hello ...name...
http
POST /greetings-body

...name...

===

Hello ...name...!
http
GET /response-text

===

Texte brut
http
GET /response-array

===

123
http
GET /response-array-json

===

[1, 2, 3]
http
GET /response-hash

===

{
"firstname": "James",
"lastname": "Hoffman"
}
http
GET /response-file

===

...contenu du fichier...

JSON

rb
copier
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