Solicitação
Este guia descreve como usar o objeto Solicitação HTTP para ler dados de solicitação.
DICA
O objeto req
bruto do Node.js pode ser acessado via request.request
.
O AdonisJs passa o objeto de solicitação HTTP atual como parte do Contexto HTTP que é enviado para todos os manipuladores de rota e middleware:
Route.get('/', ({ request }) => {
//
})
No exemplo acima, usamos desestruturação ES6 para obter o objeto request
do objeto de contexto HTTP passado.
Corpo da solicitação
O objeto da solicitação oferece vários métodos úteis para ler o corpo da solicitação.
Primeiro, certifique-se de ter instalado o middleware BodyParser.
Se não tiver, siga as etapas abaixo.
Configurando o BodyParser
NOTA
Os boilerplates Fullstack e somente API vêm pré-configurados com o middleware BodyParser.
Execute o comando de instalação do BodyParser:
adonis install @adonisjs/bodyparser
Então, registre o provedor dentro do arquivo start/app.js
:
// .start/app.js
const providers = [
'@adonisjs/bodyparser/providers/BodyParserProvider'
]
Finalmente, registre o middleware global dentro do arquivo start/kernel.js
:
// .start/kernel.js
const globalMiddleware = [
'Adonis/Middleware/BodyParser'
]
Métodos do corpo
A seguinte lista de métodos pode ser usada para ler o corpo da solicitação.
all
Retorna um objeto contendo todos os dados da solicitação (mescla parâmetros de consulta e dados do corpo da solicitação):
const all = request.all()
get
Retorna um objeto contendo dados de parâmetros de consulta:
const query = request.get()
post
Retorna um objeto contendo dados do corpo da solicitação:
const body = request.post()
raw
Retorna dados brutos do corpo como uma string:
const raw = request.raw()
OBSERVAÇÃO
Se os dados brutos forem JSON e Content-type: application/json
estiver definido, o BodyParser os analisará de forma inteligente e os retornará como parte do método post
.
only
Retorna um objeto com apenas as chaves especificadas:
const data = request.only(['username', 'email', 'age'])
except
Retorna um objeto com tudo, exceto as chaves especificadas (oposto de only):
const data = request.except(['csrf_token', 'submit'])
input
Obtém o valor de uma determinada chave (se não existir, retorna o valor default
):
const drink = request.input('drink')
// com valor padrão
const drink = request.input('drink', 'coffee')
Solicitar coleção
Muitas vezes, você pode querer manipular formulários HTML que enviam uma matriz de dados sobre pares chave/valor.
Por exemplo, o formulário a seguir cria vários usuários de uma vez:
<form method="POST" action="/users">
<input type="text" name="username[0]" />
<input type="text" name="age[0]" />
<input type="text" name="username[1]" />
<input type="text" name="age[1]" />
</form>
Digamos que queremos obter o nome de usuário e a idade dentro do controlador:
const users = request.only(['username', 'age'])
// output
{ username: ['virk', 'nikk'], age: [26, 25] }
O exemplo acima não pode ser salvo no banco de dados porque não está no formato correto.
Usando request.collect
, podemos formatá-lo para que esteja pronto para salvar no banco de dados:
const users = request.collect(['username', 'age'])
// Saída
[{ username: 'virk', age: 26 }, { username: 'nikk', age: 25 }]
// salve para o banco de dados
await User.createMany(users)
Cabeçalhos
Você pode ler os cabeçalhos da solicitação usando um dos seguintes métodos.
header
O valor do cabeçalho para uma determinada chave (opcionalmente com valor padrão):
var auth = request.header('authorization')
// case-insensitive
var auth = request.header('Authorization')
// com valor padrão
const other = request.header('some-other-header', 'default')
headers
Retorna um objeto de todos os dados do cabeçalho:
const headers = request.headers()
Cookies
Você pode ler cookies da solicitação usando um dos seguintes métodos.
cookie
O valor do cookie para uma determinada chave (opcionalmente com valor padrão):
const cartTotal = request.cookie('cart_total')
// com valor padrão
const cartTotal = request.cookie('cart_total', 0)
cookies
Retorna um objeto de todos os dados do cookie:
const cookies = request.cookies()
Os seguintes métodos são usados para ler cookies definidos no lado do cliente.
plainCookie
O valor bruto do cookie para uma determinada chave (opcionalmente com valor padrão):
const jsCookie = request.plainCookie('cart_total')
// com valor padrão
const jsCookie = request.plainCookie('cart_total', 0)
plainCookies
Retorna um objeto de todos os dados brutos do cookie:
const plainCookies = request.plainCookies()
Negociação de conteúdo
Negociação de conteúdo é uma maneira do servidor e do cliente decidirem sobre o melhor tipo de resposta a ser retornado do servidor.
Os servidores da Web não servem apenas páginas da Web, eles também precisam lidar com respostas de API servidas como JSON, XML, etc.
Em vez de criar URLs separadas para cada tipo de conteúdo, o consumidor pode pedir ao servidor para retornar a resposta em um formato específico.
Para construir a resposta em um formato específico, o servidor precisa saber o formato solicitado primeiro. Isso pode ser feito usando o método accepts
.
accepts
Lê o cabeçalho Accept
para ajudar a determinar o formato da resposta:
const bestFormat = request.accepts(['json', 'html'])
if (bestFormat === 'json') {
return response.json(users)
}
return view.render('users.list', { users })
language
O idioma também pode ser negociado com base no cabeçalho Accept-Language
:
const language = request.language(['en', 'fr'])
Métodos de solicitação
Abaixo está uma lista de todos os métodos de solicitação e seus usos de exemplo.
url
Retorna a URL da solicitação atual:
const url = request.url()
originalUrl
Retorna a URL da solicitação atual completa com strings de consulta:
const url = request.originalUrl()
method
Retorna o método de solicitação HTTP:
const method = request.method()
intended
Como o AdonisJs permite falsificação de método, você pode buscar o método real usando o método intended
:
const method = request.intended()
ip
Retorna o endereço IP mais confiável para o usuário:
const ip = request.ip()
ips
Retorna uma matriz de ips do mais para o menos confiável (remove o endereço ip padrão, que pode ser acessado pelo método ip
):
const ips = request.ips()
subdomains
Retorna uma lista de subdomínios de solicitação (remove www
da lista):
const subdomains = request.subdomains()
ajax
Verifica o cabeçalho X-Requested-With
para determinar se a solicitação é ajax ou não:
if (request.ajax()) {
// faça alguma coisa
}
pjax
Pjax é uma maneira evoluída de usar Ajax para fornecer melhores experiências de usuário para aplicativos tradicionais. No mundo Rails, é conhecido como Turbolinks.
Este método procura o cabeçalho X-PJAX
para identificar se uma solicitação é pjax ou não:
if (request.pjax()) {
// faça alguma coisa
}
hostname
Retorna o nome do host da solicitação:
const hostname = request.hostname()
protocol
Retorna o protocolo da solicitação:
const protocol = request.protocol()
match
Retorna se o conjunto de expressões passadas corresponde à URL da solicitação atual:
// URL de solicitação atual - posts/1
request.match(['posts/:id']) // retorna true
hasBody
Um booleano que indica se a solicitação tem um corpo de postagem (usado principalmente pelo BodyParser para determinar se deve ou não analisar o corpo):
if (request.hasBody()) {
// faça alguma coisa
}
is
O método is
retorna o melhor tipo de conteúdo correspondente para a solicitação atual.
A verificação é inteiramente baseada no cabeçalho content-type
:
// assumindo que o tipo de conteúdo é `application/json`
request.is(['json', 'html']) // retorna - json
request.is(['application/*']) // retorna - application/json
Método spoofing
Formulários HTML são capazes apenas de fazer solicitações GET
e POST
, o que significa que você não pode utilizar as convenções REST de outros métodos HTTP como PUT
, DELETE
e assim por diante.
AdonisJs simplifica ignorar o método de solicitação adicionando um parâmetro _method
à sua sequência de consulta, executando a rota correta para você automaticamente:
// .start/routes.js
Route.put('users', 'UserController.update')
<form method="POST" action="/users?_method=PUT">
O exemplo acima funciona nos seguintes casos:
- O método de solicitação original é
POST
. allowMethodSpoofing
é habilitado dentro do arquivoconfig/app.js
.
Estendendo solicitação
Também é possível estender o protótipo Request
adicionando seus próprios métodos, conhecidos como macros.
NOTA
Como o código para estender Request
precisa ser executado apenas uma vez, você pode usar providers ou Ignitor hooks para fazer isso. Leia Extending the Core para obter mais informações.
const Request = use('Adonis/Src/Request')
Request.macro('cartValue', function () {
return this.cookie('cartValue', 0)
})