URL matriz de parâmetros de vs.os parâmetros de solicitação
-
20-09-2019 - |
Pergunta
Eu estou querendo saber se para usar a matriz ou parâmetros de consulta no meu URLs.Eu encontrei um velho discussão para que o tópico não satisfatório.
Exemplos
- URL de consulta de parâmetros: http://some.where/thing?paramA=1¶mB=6542
- URL com matriz de parâmetros: http://some.where/thing;paramA=1;paramB=6542
À primeira vista, a matriz de parâmetros parecem ter apenas vantagens:
- mais legível
- nenhuma codificação e decodificação de "&" em documentos XML é necessário
- URLs com "?" não são armazenados em cache em muitos casos;URLs com matriz de parâmetros são armazenados em cache
- matriz de parâmetros pode aparecer em qualquer lugar no caminho e não estão limitados ao fim
- matriz de parâmetros pode ter mais de um valor:
paramA=val1,val2
Mas também há desvantagens:
- apenas alguns frameworks como JAX-RS matriz de suporte parâmetros
- Quando um browser envia um formulário via GET, params tornar consulta de parâmetros.Assim, termina 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 desenvolvedores de serviços, seria mais fácil usar sempre consulta params - nesta área.
Desde que o desenvolvedor do serviço pode escolher um quadro com matriz param de apoio, a desvantagem seria que os navegadores criam, por padrão, os parâmetros de consulta.
Existem outras desvantagens?O que você faria?
Solução
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 de repouso para vários níveis de recursos e sub-recursos:
http://example.com/res/categories;name=foo/objects;name=green/?page=1
Realmente se resume ao nome para o nome. Se apenas os parâmetros de consulta fossem usados, você acabaria com parâmetros como "category_name" e "object_name" e você perderia a clareza adicionada pela localidade dos parâmetros dentro da solicitação. Além disso, ao usar uma estrutura como o 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 é realmente importante e os dois tipos de parâmetros sã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ê fique com os parâmetros de consulta para formas HTML e APIs HTTP simples e simples de nível único.
Outras dicas
-É importante ser relegado a comentar a seção .--
Não tenho certeza de qual é o problema dos URLs da matriz. De acordo com o artigo de design do W3C que a TBL escreveu, era apenas uma ideia de design e afirma explicitamente que não é um recurso da web. Coisas como URLs relativas não são implementadas ao usá -lo. Se você quiser usá -lo, tudo bem; Simplesmente não existe uma maneira padrão de usá -lo porque não é um padrão. - Steve Pomeroy
A resposta tão curta é: se você precisar de RS para fins comerciais, é melhor usar o parâmetro de solicitação.
Além de Tim Silvestre da resposta que eu gostaria de dar um exemplo de como a matriz de parâmetros podem ser tratados com JAX-RS .
Matriz de parâmetros no último recurso elemento
http://localhost:8080/res/categories/objects;name=green
Você pode acessá-los usando o
@MatrixParam
anotação@GET @Path("categories/objects") public String objects(@MatrixParam("name") String objectName) { return objectName; }
Resposta
green
Mas, como o Javadoc estados
Observe que o
@MatrixParam
anotação de valor refere-se a um nome de uma matriz de parâmetro que reside no última correspondência segmento de caminho do Caminho-anotada Java estrutura que injeta o valor do parâmetro matriz....o que nos leva ao ponto 2
Matriz de parâmetros no meio de uma URL
http://localhost:8080/res/categories;name=foo/objects;name=green
Você pode acessar matriz de parâmetros em qualquer lugar usando variáveis de caminho e
@PathParam
PathSegment
.@GET @Path("{categoryVar:categories}/objects") public String objectsByCategory(@PathParam("categoryVar") PathSegment categorySegment, @MatrixParam("name") String objectName) { MultivaluedMap<String, String> matrixParameters = categorySegment.getMatrixParameters(); String categorySegmentPath = categorySegment.getPath(); String string = String.format("object %s, path:%s, matrixParams:%s%n", objectName, categorySegmentPath, matrixParameters); return string; }
Resposta
object green, path:categories, matrixParams:[name=foo]
Desde que a matriz de parâmetros são fornecidos como um
MultivaluedMap
você pode acessar cada um porList<String> names = matrixParameters.get("name");
ou se você só precisa do primeiro
String name = matrixParameters.getFirst("name");
Obter todas matriz de parâmetros como um parâmetro do método
http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size
Usar um
List<PathSegment>
para obtê-los todos@GET @Path("all/{var:.+}") public String allSegments(@PathParam("var") List<PathSegment> pathSegments) { StringBuilder sb = new StringBuilder(); for (PathSegment pathSegment : pathSegments) { sb.append("path: "); sb.append(pathSegment.getPath()); sb.append(", matrix parameters "); sb.append(pathSegment.getMatrixParameters()); sb.append("<br/>"); } return sb.toString(); }
Resposta
path: categories, matrix parameters [name=foo] path: objects, matrix parameters [name=green] path: attributes, matrix parameters [name=size]