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

À 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?

Foi útil?

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 .

  1. 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

  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 por

    List<String> names = matrixParameters.get("name");
    

    ou se você só precisa do primeiro

    String name = matrixParameters.getFirst("name");
    
  3. 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]
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top