URL matris parametreleri ile sorgu parametreleri


176

URL'lerimde matris veya sorgu parametreleri kullanıp kullanmayacağımı merak ediyorum. Bu konuyla ilgili eski bir tartışmayı tatmin edici bulmadım.

Örnekler

İlk bakışta matris parametrelerinin sadece avantajları var gibi görünüyor:

  • daha okunabilir
  • XML belgelerinde "&" kodlaması ve kod çözmesi gerekmez
  • "?" birçok durumda önbelleğe alınmaz; Matris parametreleri olan URL'ler önbelleğe alınır
  • matris parametreleri yolun her yerinde görünebilir ve sonu ile sınırlı değildir
  • matris parametreleri birden fazla değere sahip olabilir: paramA=val1,val2

Ancak dezavantajlar da vardır:

  • JAX-RS gibi sadece birkaç çerçeve matris parametrelerini destekler
  • Bir tarayıcı GET aracılığıyla bir form gönderdiğinde, parametreler sorgu parametreleri haline gelir. Böylece aynı görev için iki tür parametre ile sonuçlanır. REST hizmetlerinin kullanıcılarının kafasını karıştırmamak ve hizmet geliştiricileri için gösterilen çabayı sınırlamak için, bu alanda her zaman sorgu parametrelerini kullanmak daha kolay olacaktır.

Hizmetin geliştiricisi matris param desteğine sahip bir çerçeve seçebildiğinden, geriye kalan tek dezavantaj, tarayıcıların varsayılan sorgu parametreleriyle oluşturmasıdır.

Başka dezavantajları var mı? Sen ne yapardın?


10
Matris URL'leri ile ilgili önemli olan şeyin ne olduğundan emin değilim. TBL'nin yazdığı w3c tasarım makalesine göre, bu sadece bir tasarım fikriydi ve web'in bir özelliği olmadığını açıkça belirtiyor . Göreli URL'ler gibi şeyler, kullanılırken uygulanmaz. Kullanmak istiyorsanız, sorun değil; standart bir yol olmadığı için kullanmanın standart bir yolu yoktur.
Steve Pomeroy

2
@Steve Pomeroy: Bahsettiğiniz makale bu mu: w3.org/DesignIssues/MatrixURIs.html
Marcel

3
@Marcel: evet. Matris URL'lerini düşünenler için, dokümanın üst kısmındaki "Durum: kişisel görünüm" e dikkat edin.
Steve Pomeroy

matris parametrelerinin birden fazla değeri olabilir mi? Gerçekten mi?
Ayyash

Yanıtlar:


212

Önemli fark, sorgu parametreleri bir bütün olarak talebe uygulanırken matris parametrelerinin belirli bir yol elemanına uygulanmasıdır. Bu, birden fazla kaynak ve alt kaynak düzeyine REST tarzı karmaşık bir sorgu yapılırken devreye girer:

http://example.com/res/categories;name=foo/objects;name=green/?page=1

Gerçekten ad boşluğuna geliyor.

Not: Burada kaynakların 'düzeyleri' vardır categoriesve objects.

Çok düzeyli bir URL için yalnızca sorgu parametreleri kullanılmış olsaydı,

http://example.com/res?categories_name=foo&objects_name=green&page=1

Bu şekilde, istek içindeki parametrelerin yerinin eklediği netliği de kaybedersiniz. Buna ek olarak, JAX-RS gibi bir çerçeve kullanıldığında, tüm sorgu parametreleri her kaynak işleyicide görünerek olası çakışmalara ve karışıklığa neden olur.

Sorgunuzda yalnızca bir "düzey" varsa, fark gerçekten önemli değildir ve iki tür parametre etkin bir şekilde değiştirilebilir, ancak sorgu parametreleri genellikle daha iyi desteklenir ve daha yaygın olarak tanınır. Genel olarak, HTML formları ve basit, tek düzeyli HTTP API'leri gibi şeyler için sorgu parametrelerine bağlı kalmanızı öneririm.


2
irrelavant: /?bölüm bir kaynağı temsil ediyor mu?
Jin Kwon

7
?İsteğin sorgu parametresi bölümünü başlatır. Sorgu parametreleri, matris parametrelerinin aksine, en yaygın URL parametreleri türüdür. Soru işaretinden önceki eğik çizgi, query parametresinin pageeğik çizgiden önceki matris parametresine çalışmadığından emin olur . Herhangi bir matris parametreleri bağlı olmadığını varsayalım categories, sorgu parametreleri bu gibi eğik çizgi olmadan bağlı olabilir:http://example.com/res/categories?page=1
Teemu Leisti 9:13

8
Matris parametrelerinin herhangi bir yol segmentinde belirtilebileceği doğru olsa da, örneğin JAX-RS bunları @MatrixParam ile enjekte ederken eklendikleri yol segmentiyle ilişkilendirmez. "JAX-RS 2.0 ile Dinlendirici Java" ya göre, "GET / mercedes / e55; color = black / 2006 / interior; color = tan" gibi bir istek, renk matrisi parametresinin belirsiz bir tanımına sahip olacaktır. Her bir PathSegment'ı ayrı ayrı işlerseniz, bunu anlayabilirsiniz ... Çok kullanışlı ama almak için daha fazla iş, categoryName = foo; objectName = green belirttiğinizden daha fazla.
UFL1138

15

Tim Sylvester'ın cevabına ek olarak , JAX-RS ile matris parametrelerinin nasıl ele alınabileceğine dair bir örnek sunmak istiyorum .

  1. Son kaynak öğedeki matris parametreleri

    http://localhost:8080/res/categories/objects;name=green

    @MatrixParamEk açıklamayı kullanarak bunlara erişebilirsiniz

    @GET
    @Path("categories/objects")
    public String objects(@MatrixParam("name") String objectName) {
      return objectName;
    }

    Tepki

    green

    Ama Javadoc devletleri gibi

    @MatrixParamEk açıklama değerinin , matris parametresinin değerini enjekte eden Yol açıklamalı Java yapısının son eşleşen yol segmentinde bulunan bir matris parametresinin adını ifade ettiğini unutmayın .

    ... bizi 2. noktaya getiren şey

  2. Bir URL'nin ortasındaki matris parametreleri

    http://localhost:8080/res/categories;name=foo/objects;name=green

    Yol değişkenlerini ve kullanarak matris parametrelerine her yerden erişebilirsiniz @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;
    }

    Tepki

    object green, path:categories, matrixParams:[name=foo]

    Matris parametreleri bir olarak sağlandığından, MultivaluedMapher birine

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

    ya da sadece ilkine ihtiyacınız varsa

    String name = matrixParameters.getFirst("name");
  3. Tüm matris parametrelerini tek bir yöntem parametresi olarak alın

    http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size

    List<PathSegment>Hepsini almak için a tuşunu kullanın

    @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();
    }

    Tepki

    path: categories, matrix parameters [name=foo]
    path: objects, matrix parameters [name=green]
    path: attributes, matrix parameters [name=size]

10

- Yorum bölümüne bırakılması çok önemlidir. -

Matris URL'leri ile ilgili önemli olan şeyin ne olduğundan emin değilim. TBL'nin yazdığı w3c tasarım makalesine göre, bu sadece bir tasarım fikriydi ve web'in bir özelliği olmadığını açıkça belirtiyor. Göreli URL'ler gibi şeyler, kullanılırken uygulanmaz. Kullanmak istiyorsanız, sorun değil; standart bir yol olmadığı için kullanmanın standart bir yolu yoktur. - Steve Pomeroy

Bu nedenle kısa yanıt, iş amaçlı RS'ye ihtiyacınız varsa, request parametresini kullanmanız daha iyi olur.


5
Birisi, bunu uygulamak için ihtiyaç duydukları kadar benzersiz olduklarına karar veren Açısal 2 geliştiricilerine bunu söyledi!
Matt Pileggi

2
@MattPileggi Bunu ayrıca Açısal 2 yüzünden de okuyorum. Açısal 2'nin hemen hemen her yönü son derece uzmanlaşmış, alışılmadık ve mevcut kullanım alışkanlıklarına aykırı. Bunun henüz kanıtlanamaması, azaltıcı değer katmaktadır.
Aluan Haddad

1
Yani çocuklar, ben de aynı nedenden dolayı buradayım, ama açısal 2 takım github sayfasında url matrisi ve google analytis ile ilgili bu konuya bu tartışmaya bazı noktalar eklememe izin verin: github.com/angular/angular/issues/11740 Ama Bu konuda bazı araştırmalardan sonra, url matris notasyonu , özellikle orta veya url'de bir parametreye ihtiyaç duyduğumuzda (yalnızca sonunda değil) , url sorgu parametrelerinden daha insan tarafından okunabilir görünüyor .
Richard Lee

8
Sanırım bu standart olmayan herkes uri şablon spec aşina değil mi? Yol parametrelerine karmaşık nesneleri kodlamak uri şablonlarının çok kullanışlı bir özelliğidir; çoğu insanın bunu bilmemesi veya kullanması, hayatınıza işe yaramaz karmaşıklık enjekte etmenin açısal geliştiriciler tarafından kötü bir komplo olduğu anlamına gelmez.
Ajax

2
Pffft - "<şimdiye kadar var olduğunu bilmediğim şey> standart dışı , bu yüzden cehaletimin kabul edilebilirliğini koruyor". TBL'nin bir fikirle karar vermesi ya da yapmadığı karar büyük ölçüde önemsizdir. Web'in özellikleri , 2001 yılında web'in bir özelliği değildi . Web'in özellikleri , istemci ve sunucu uygulayıcılarının seçtikleri her şeydir. Açısal matris parametrelerini destekliyorsa ve JAX-RS bunları destekliyorsa ve bunlar uygulama araçlarını seçtiyseniz, devam edin ve neyin işe yaradığını kullanın.
Dave
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.