Antes de ler minha resposta, gostaria de dizer que concordei com @Neil. Temos que escolher nossas batalhas. Geralmente, queremos dar o melhor de nós, mas às vezes há muito pouco espaço para discussão e precisamos tomar decisões contra a nossa vontade.
De qualquer forma, na resposta de Neil, sinto falta de mais uma coisa. Documentação . Apenas para garantir que os desenvolvedores saibam que os pedidos do POST /search
são seguros.
Dito isto.
1. Dê uma chance para GET
Considere a GET
opção primeiro. Confira o comprimento máximo do URL desta pergunta . Avalie se sua cadeia de caracteres de consulta mais longa tem mais de 2000 caracteres. Se não, e você não espera, continue GET
. Pode parecer feio, mas pelo menos você pode marcar o URL como favorito e, é claro, tem todas as vantagens derivadas da semântica do método (idempotência, segurança e armazenamento em cache)
1.1 Tente codificar a string de consulta
Por exemplo, na base 64. Até o javascript suporta codificações da base 64 .
É assim que funciona:
- Crie o JSON com todos os filtros e normalize-o.
- Analise-o como string
- Codifique
- Envie o JSON codificado como solicitação param (
/search?q=SGVsbG8gV29ybGQh....
).
- No lado do servidor, decodifique o parâmetro q .
- Desserializar a sequência JSON
Anteriormente, crie a cadeia JSON mais longa possível, codifique-a e obtenha o comprimento. Avalie se a sequência codificada se encaixa na URL. Eu implementei o seguinte snippet no Fiddle.js para você testar. (Espero que ainda funcione) 1
Os códigos da base 64 são determinísticos e reversíveis, portanto não há chance de colisões.
Com consultas codificadas, também poderíamos salvar pesquisas no banco de dados, marcar o URL como favorito, compartilhar links etc. E, é claro, não precisamos escapar / tirar o escape da string.
1.2 Tente com aliases
Lendo este blog sobre como criar APIs REST, lembrei-me de mais uma alternativa. Aliases para consultas comuns .
Acho isso interessante pelas próximas razões
Encurte o comprimento da string de consulta. Torna a API mais limpa e fácil de usar
GET / tickets /? Status = fechado e fechadoAt = xxx vs
GET / tickets / recentemente fechado /
Combinável com mais aliases ou mais parâmetros de solicitação.
GET / tickets /? Status = fechado e fechadoAt = xxx e dentro de 30min vs
GET / tickets / recentemente fechado /? Within = 30min
Podemos combinar aliases com cadeias de consulta codificadas
GET / tickets /? Status = fechado e fechadoAt = xxx e dentro de 30min vs
GET / tickets / recentemente fechado /? Q = SGVsbG8g ...
1: usei o JSON, mas poderíamos usar outros formatos assim que desserializá-lo no lado do servidor.
search?q=t
,search?q=te
,search?q=test
e assim por diante. Considere limitar a frequência com que a consulta é enviada para evitar danos ao servidor. Como alternativa, você também pode retornar uma grande quantidade de informações e, no lado do cliente, fazer a filtragem. Isso funciona bem se o usuário inserir categorias amplas que podem restringir bastante as coisas.