Rutas
En Sinatra las rutas se definen utilizando el verbo (en minúscula) seguido del path y recibe un bloque de Ruby con el código que se quiere ejecutar cuando una petición coincide con el verbo y el path.
get '/' do
.. show something ..
end
post '/' do
.. create something ..
end
put '/' do
.. replace something ..
end
patch '/' do
.. modify something ..
end
delete '/' do
.. annihilate something ..
end
Desafortunadamente, desde los navegadores solo podemos realizar peticiones de tipo
GET
y POST
(formularios).Para realizar peticiones con
PUT
, PATCH
, DELETE
, etc. podemos utilizar curl, Postman o algún lenguaje de programación (como Ruby!).La primera ruta que coincide con la petición es la que se ejecuta.
Las rutas que tienen un slash al final son diferentes de las que no lo tienen:
get '/foo' do
# No coincide con "GET /foo/"
end
Lo que retornes en cada ruta se va a convertir en el mensaje HTTP de respuesta. Puedes devolver:
- Un string que se va a convertir en el cuerpo de la respuesta.
- Un número con el código de respuesta (200, 404, etc.)
- Un arreglo con dos elementos: el código de respuesta y el cuerpo de la respuesta.
- Un arreglo con tres elementos: el código de respuesta, un hash con los encabezados y el cuerpo de la respuesta.
Si retornas sólo un string el código de respuesta es 200 OK.
También existen los métodos
body
, status
y headers
que te permiten escribir el cuerpo, código de respuesta y los encabezados respectivamente, pero lo que se recomienda es definir esta información en lo que retorne el bloque.El siguiente ejemplo:
get '/' do
[200, { "Content-Type" => "text/html" }, "Hola Mundo"]
end
Es equivalente a:
get '/' do
status 200
headers "Content-Type" => "text/html"
body "Hola Mundo"
end
El query string es el conjunto de propiedades que van después del signo de interrogación (
?
) de un URL. Sinatra automáticamente convierte las propiedades en el hash params
.Por ejemplo, si quieres obtener el valor de una propiedad llamada
name
utilizarías params[:name]
:get '/greet' do
"Hola #{params[:name]}"
end
Los valores siempre se retornan como cadenas de texto. Si esperas un número debes convertirlo manualmente. Por ejemplo:
get '/age-in-5-years' do
age = params[:age].to_i
"Tu edad en 5 años será: #{age + 5}"
end
Puedes utilizar variables en las rutas que puedes obtener a través del hash
params
:get '/hello/:name' do
# coincide con "GET /hello/juan" and "GET /hello/pedro"
# params['name'] is 'juan' or 'pedro'
"Hello #{params['name']}!"
end
En tu código puedes utilizar el objeto
request
para acceder a toda la información de la petición HTTP:request.url # retorna el URL completo
request.request_method # GET, POST, PUT, etc.
request.path # el path del URL
request.host # el host del URL
request.port # el port
request.scheme # http o https
request.query_string # todo lo que va después de ? en la URL
request.body # el cuerpo del mensaje (si tiene)
request.ip # la IP desde donde se hizo la petición
request.accept # el valor del encabezado Accept
request.user_agent # el valor del encabezado User-Agent
request.referrer # el valor del encabezado Referrer
request.content_type # el valor del encabezado Conten-Type
Nota: Si deseas obtener el valor de otro encabezado tienes que utilizar el objeto
env
, pasar el encabezado a mayúscula y agregarle el prefijo HTTP_
. Por ejemplo:env['HTTP_X_HEADER'] # Retorna el valor del encabezado X_Header
Last modified 2mo ago