Eu estou querendo saber se deve usar parâmetros de matriz ou consulta em meus URLs. Eu achei uma discussão mais antiga sobre esse tópico não satisfatória.
Exemplos
- URL com parâmetros de consulta: http: //some.where/thing? ParamA = 1 & paramB = 6542
- URL com parâmetros de matriz: http: //some.where/thing; paramA = 1; paramB = 6542
À primeira vista, os parâmetros de matriz parecem ter apenas vantagens:
- mais legível
- nenhuma codificação e decodificação de "&" em documentos XML é necessária
- URLs com "?" não são armazenados em cache em muitos casos; URLs com parâmetros de matriz são armazenados em cache
- parâmetros de matriz podem aparecer em qualquer lugar do caminho e não estão limitados ao seu final
- parâmetros de matriz podem ter mais de um valor:
paramA=val1,val2
Mas também há desvantagens:
- apenas algumas estruturas, como JAX-RS, suportam parâmetros de matriz
- Quando um navegador envia um formulário via GET, os parâmetros se tornam parâmetros de consulta. Portanto, acaba em dois tipos de parâmetros para a mesma tarefa. Para não confundir os usuários dos serviços REST e limitar o esforço para os desenvolvedores dos serviços, seria mais fácil usar sempre os parâmetros de consulta - nesta área.
Como o desenvolvedor do serviço pode escolher uma estrutura com suporte a parâmetros de matriz, a única desvantagem restante seria que os navegadores criem por parâmetros de consulta padrão.
Existem outras desvantagens? O que você faria?
Respostas:
A diferença importante é que os parâmetros da matriz se aplicam a um elemento de caminho específico, enquanto os parâmetros de consulta se aplicam à solicitação como um todo. Isso entra em jogo ao fazer uma consulta complexa no estilo REST para vários níveis de recursos e sub-recursos:
Realmente se resume ao namespacing.
Nota: Os 'níveis' de recursos aqui são
categories
eobjects
.Se apenas parâmetros de consulta fossem usados para um URL de vários níveis, você terminaria com
Dessa forma, você também perderia a clareza adicionada pela localidade dos parâmetros na solicitação. Além disso, ao usar uma estrutura como JAX-RS, todos os parâmetros de consulta apareceriam em cada manipulador de recursos, levando a possíveis conflitos e confusão.
Se sua consulta tiver apenas um "nível", a diferença não será realmente importante e os dois tipos de parâmetros serão efetivamente intercambiáveis. No entanto, os parâmetros de consulta geralmente são mais bem suportados e mais amplamente reconhecidos. Em geral, eu recomendaria que você se atenha aos parâmetros de consulta para coisas como formulários HTML e APIs HTTP simples e de nível único.
fonte
/?
parte representa um recurso??
inicia a parte parâmetro de consulta do pedido. Os parâmetros de consulta são o tipo mais comum de parâmetros de URL, em oposição aos parâmetros da matriz. A barra antes do ponto de interrogação garante que o parâmetro de consultapage
não seja executado no parâmetro da matriz que precede a barra. Suponho que, se não houvesse parâmetros de matriz ligados acategories
, os parâmetros de consulta poderia anexado sem a barra assim:http://example.com/res/categories?page=1
Além da resposta de Tim Sylvester, gostaria de fornecer um exemplo de como os parâmetros da matriz podem ser tratados com o JAX-RS .
Parâmetros da matriz no último elemento do recurso
Você pode acessá-los usando a
@MatrixParam
anotaçãoResposta
Mas, como os estados Javadoc
... o que nos leva ao ponto 2
Parâmetros da matriz no meio de uma URL
Você pode acessar os parâmetros da matriz em qualquer lugar usando as variáveis de caminho e
@PathParam
PathSegment
.Resposta
Como os parâmetros da matriz são fornecidos como um,
MultivaluedMap
você pode acessar cada um deles.ou se você só precisa do primeiro
Obter todos os parâmetros da matriz como um parâmetro de método
Use a
List<PathSegment>
para obter todosResposta
fonte
--Muito importante ser relegado para a seção de comentários .--
Não sei ao certo qual é o problema dos URLs da matriz. De acordo com o artigo de design do w3c que a TBL escreveu, era apenas uma idéia de design e afirma explicitamente que não é um recurso da web. Coisas como URLs relativos não são implementadas ao usá-lo. Se você quiser usá-lo, tudo bem; simplesmente não há uma maneira padrão de usá-lo, porque não é um padrão. - Steve Pomeroy
Uma resposta tão curta é que, se você precisar do RS para fins comerciais, é melhor usar o parâmetro request.
fonte