Solicitação
O AdonisJs torna super fácil acessar informações de solicitação HTTP. Todos os métodos do controlador e fechamentos de rota recebem uma instância da classe Request
, que é uma camada açucarada sobre a solicitação HTTP do Node.js.
DICA
Você pode acessar o objeto de solicitação bruto do Node.js como request.request
.
Exemplo básico
Vamos pegar o caso clássico de ler o corpo da solicitação para uma determinada solicitação HTTP.
const Route = use('Route')
Route.get('posts', function * (request, response) {
const body = request.all()
// seleção de campos
const body = request.only('title', 'description', 'categories')
})
Métodos de solicitação
Abaixo está a lista de todos os métodos disponíveis na instância Request
.
all()
Retorna todos os valores extraídos das strings de consulta e do corpo da solicitação.
const data = request.all()
input(key, [defaultValue])
Retorna o valor das strings de consulta e do corpo da solicitação para uma determinada chave. Se o valor não existir, o valor padrão será retornado.
const name = request.input('name')
const subscribe = request.input('subscribe', 'yes')
only(...keys)
Semelhante a all, mas retorna um objeto com valores selecionados de chaves definidas. null
será retornado para chaves não existentes.
const data = request.only('name', 'email', 'age')
/* retorna
{
name: '..',
email: '..',
age: '..'
}
*/
except(...keys)
Oposto de only
const data = request.except('_csrf', 'submit')
get
Retorna um objeto serializado de strings de consulta.
const data = request.get()
post
Retorna um objeto serializado do corpo da solicitação.
const data = request.post()
fresh
Informa se a solicitação é nova ou não, verificando ETag e o cabeçalho expires.
request.fresh()
stale
Oposto de fresh
request.stale()
ip
Retorna o endereço IP mais confiável para uma determinada solicitação. Se seu aplicativo estiver atrás de um servidor proxy como o Nginx, certifique-se de habilitar http.trustProxy
dentro do arquivo config/app.js
.
request.ip()
ips
Retorna uma matriz de endereços IP classificados do mais para o menos confiável.
request.ips()
secure
Informa se a solicitação é atendida por HTTPS ou não.
request.secure()
subdomains
Retorna uma matriz de subdomínios para uma URL fornecida. Por exemplo, api.example.org
terá o subdomínio como ['api']
.
request.subdomains()
ajax
Retorna se a solicitação atual é feita usando Ajax(XMLHttpRequest) ou não.
request.ajax()
pjax
Pjax é uma solicitação ajax híbrida. Se você é do mundo Ruby on Rails, é bem parecido com Turbolinks.
hostname
Retorna o nome do host da solicitação.
request.hostname()
url
Retorna a URL atual da solicitação. Ela cortará a string de consulta.
// url - http://foo.com/users?orderBy=desc&limit=10
request.url()
// retorna - http://foo.com/users
originalUrl
request.originalUrl()
method
request.method()
param(key, [defaultValue])
Retorna o parâmetro de rota para uma determinada chave. Saiba mais sobre os parâmetros de rota aqui.
params
Retorna todos os params como um objeto.
request.params()
format
Retorna o formato atual para uma determinada solicitação. Para que funcione, você precisa definir formatos de rota.
request.format()
match(...keys)
Retorna um booleano indicando se a URL da solicitação atual corresponde a algum dos padrões fornecidos.
// url - /user/1
request.match('/users/:id') // true
request.match('/users/all') // false
request.match('/users/all', '/user/(.+)') // true
hasBody
Retorna se a solicitação tem o corpo ou não.
request.hasBody()
Cabeçalhos
Você pode usar os métodos abaixo para ler cabeçalhos de solicitação
header(key, [defaultValue])
Retorna o valor para uma determinada chave de cabeçalho ou retorna o valor padrão.
const csrfToken = request.header('CSRF-TOKEN')
// ou
const time = request.header('x-time', new Date().getTime())
headers
Retorna todos os cabeçalhos como um objeto.
request.headers()
Coleção de solicitações
Muitas vezes, os aplicativos têm requisitos para salvar várias entradas no banco de dados usando formulários HTML. Vamos dar um exemplo de salvar vários usuários.
<form method="POST" action="/users">
<div class="row">
<h2> User 1 </h2>
<input type="email" name="email[]" />
<input type="password" name="password[]" />
</div>
<div class="row">
<h2> User 2 </h2>
<input type="email" name="email[]" />
<input type="password" name="password[]" />
</div>
<button type="submit"> Create Users </button>
</form>
Acima, definimos email[]
e password[]
como uma matriz para que possamos enviar vários usuários em uma única solicitação e a entrada no servidor será bem semelhante ao formato abaixo.
// Recebido
{
email: ['bar@foo.com', 'baz@foo.com'],
password: ['secret', 'secret1']
}
Até este ponto, o formulário está fazendo o que deveria fazer. Enquanto os dados recebidos pelo servidor são bem difíceis de processar para colocá-los no formato correto.
// Esperado
[
{
email: 'bar@foo.com',
password: 'secret'
},
{
email: 'baz@foo.com',
password: 'secret1'
}
]
Claro, você pode fazer um loop pela entrada original e criar uma nova matriz conforme a saída esperada, mas isso parece ser demais para um caso de uso geral. O AdonisJs torna todo o processo perfeito ao introduzir um método auxiliar chamado collect
.
collect(...keys)
const users = request.collect('email', 'password')
const savedUsers = yield User.createMany(users)
Negociação de conteúdo
A negociação de conteúdo é uma maneira de encontrar o melhor tipo de resposta para uma determinada solicitação. O usuário final faz uso de cabeçalhos HTTP para definir o tipo de resposta que espera do servidor.
DICA
Você também pode fazer uso de Rotas para definir tipos de retorno explícitos. Saiba mais sobre negociação de conteúdo via rotas.
is(...keys)
Retorna se uma solicitação é um dos tipos fornecidos. Este método analisará o cabeçalho Content-type da solicitação.
const isPlain = request.is('html', 'plain')
accepts(...keys)
Verifica o cabeçalho Accept
para negociar o melhor tipo de resposta para uma determinada solicitação HTTP.
const type = request.accepts('json', 'html')
switch (type) {
case 'json':
response.json({hello:"world"})
break
case 'html':
response.send('<h1>Hello world</h1>')
break
}
Estendendo a solicitação
Muitas vezes, você tem o requisito de estender o protótipo Request
anexando novos métodos. O mesmo pode ser feito definindo uma macro na classe Request.
Específico do aplicativo
Se suas macros forem específicas apenas para seu aplicativo, use o arquivo app/Listeners/Http.js
para ouvir o evento start e adicionar uma macro personalizada.
// app/Listeners/Http.js
Http.onStart = function () {
const Request = use('Adonis/Src/Request')
Request.macro('cartValue', function () {
return this.cookie('cartValue', 0)
})
}
Via Provider
Se você estiver escrevendo um módulo/addon para AdonisJs, você pode adicionar uma macro dentro do método boot
do seu service provider.
const ServiceProvider = require('adonis-fold').ServiceProvider
class MyServiceProvider extends ServiceProvider {
boot () {
const Request = use('Adonis/Src/Request')
Request.macro('cartValue', function () {
return this.cookie('cartValue', 0)
})
}
* register () {
// Registro de vinculações
}
}
Macros definidas podem ser usadas como qualquer outro método request
.
const cartValue = request.cartValue()