URL 매트릭스 매개 변수와 쿼리 매개 변수


176

내 URL에 행렬 또는 쿼리 매개 변수를 사용할지 궁금합니다. 그 주제에 대한 오래된 토론 이 만족스럽지 않다는 것을 알았습니다 .

첫눈에 매트릭스 매개 변수는 장점 만있는 것 같습니다.

  • 더 읽기 쉬운
  • XML 문서에서 "&"의 인코딩 및 디코딩이 필요하지 않습니다.
  • "?"가 포함 된 URL 많은 경우에 캐시되지 않습니다. 행렬 매개 변수가있는 URL이 캐시됩니다
  • 매트릭스 매개 변수는 경로의 모든 곳에 나타날 수 있으며 그 끝으로 제한되지 않습니다
  • 행렬 매개 변수는 둘 이상의 값을 가질 수 있습니다. paramA=val1,val2

그러나 단점도 있습니다.

  • JAX-RS 와 같은 몇 가지 프레임 워크 만 매트릭스 매개 변수를 지원
  • 브라우저가 GET을 통해 양식을 제출하면 매개 변수가 쿼리 매개 변수가됩니다. 따라서 동일한 작업에 대해 두 가지 종류의 매개 변수로 끝납니다. REST 서비스 사용자를 혼동하지 않고 서비스 개발자의 노력을 제한하기 위해이 영역에서 항상 쿼리 매개 변수를 사용하는 것이 더 쉽습니다.

서비스 개발자는 매트릭스 매개 변수를 지원하는 프레임 워크를 선택할 수 있으므로 브라우저가 기본 쿼리 매개 변수로 작성한다는 단점 만 남아 있습니다.

다른 단점이 있습니까? 당신은 무엇을 하시겠습니까?


10
매트릭스 URL과 관련하여 큰 문제가 무엇인지 잘 모르겠습니다. TBL이 쓴 w3c 디자인 기사에 따르면, 이것은 단지 디자인 아이디어 일 뿐이며 웹의 기능이 아니라고 명시 적으로 언급하고 있습니다 . 상대 URL과 같은 것은 사용할 때 구현되지 않습니다. 당신이 그것을 사용하려면 괜찮습니다; 표준이 아니기 때문에 그것을 사용하는 표준 방법은 없습니다.
Steve Pomeroy

2
@Steve Pomeroy :이 기사는 당신이 언급 한 기사입니까 : w3.org/DesignIssues/MatrixURIs.html
Marcel

3
@Marcel : p. 매트릭스 URL에 대해 생각하는 사람은 문서 상단의 "상태 : 개인보기"를 참고하십시오.
Steve Pomeroy

행렬 매개 변수가 둘 이상의 값을 가질 수 있습니까? 정말?
Ayyash

답변:


212

중요한 차이점은 매트릭스 매개 변수가 특정 경로 요소에 적용되고 쿼리 매개 변수는 전체 요청에 적용된다는 것입니다. 이는 여러 수준의 리소스 및 하위 리소스에 대한 복잡한 REST 스타일 쿼리를 만들 때 사용됩니다.

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

그것은 실제로 이름 공간으로 귀착됩니다.

참고 : 여기에서 리소스의 '레벨'은 categoriesobjects입니다.

여러 수준의 URL에 쿼리 매개 변수 만 사용 된 경우

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

이 방법을 사용하면 요청 내의 매개 변수의 지역성에 의해 추가 된 명확성을 잃을 수도 있습니다. 또한 JAX-RS와 같은 프레임 워크를 사용하는 경우 모든 쿼리 매개 변수가 각 자원 핸들러 내에 표시되어 잠재적 인 충돌 및 혼란을 초래합니다.

쿼리에 "수준"이 하나만 있으면 차이는 중요하지 않으며 두 가지 유형의 매개 변수를 효과적으로 교환 할 수 있지만 일반적으로 쿼리 매개 변수가 더 잘 지원되고 더 널리 인식됩니다. 일반적으로 HTML 양식 및 간단한 단일 수준 HTTP API와 같은 쿼리 매개 변수를 사용하는 것이 좋습니다.


2
무관심 : /?자원을 나타내는 부분이 있습니까?
Jin Kwon

7
?요청의 쿼리 매개 변수 부분을 시작합니다. 쿼리 매개 변수는 매트릭스 매개 변수와 달리 가장 일반적인 유형의 URL 매개 변수입니다. 물음표 앞의 슬래시는 쿼리 매개 변수 page가 슬래시 앞에 오는 행렬 매개 변수로 실행되지 않도록합니다. 에 연결된 매트릭스 매개 변수가없는 경우 categories쿼리 매개 변수가 다음과 같이 슬래시없이 첨부 될 수 있다고 가정합니다 .http://example.com/res/categories?page=1
Teemu Leisti

8
매트릭스 매개 변수가 임의의 경로 세그먼트에 지정 될 수 있지만 JAX-RS는 @MatrixParam으로 주입 할 때 추가 된 경로 세그먼트와이를 연관시키지 않습니다. "JAX-RS 2.0이 포함 된 Java Java"에 따르면 "GET / mercedes / e55; color = black / 2006 / interior; color = tan"과 같은 요청은 컬러 매트릭스 매개 변수의 모호한 정의를 갖습니다. 각 PathSegment를 개별적으로 처리하는 것처럼 보이지만 알아낼 수 있습니다 ... 너무 유용하지만 categoryName = foo; objectName = green을 지정한 경우보다 더 많은 작업을 수행 할 수 있습니다.
UFL1138

15

Tim Sylvester의 답변 외에도 JAX-RS로 행렬 매개 변수를 처리하는 방법에 대한 예를 제공하고자합니다 .

  1. 마지막 자원 요소의 매트릭스 매개 변수

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

    @MatrixParam주석을 사용하여 액세스 할 수 있습니다

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

    응답

    green

    그러나 Javadoc 상태처럼

    참고 것을 @MatrixParam특수 값 매트릭스 파라미터의 이름에 참조하는 상주 마지막 유사한 경로 세그먼트 매트릭스 파라미터의 값을 주입 경로 - 주석 자바 구조.

    ... 2 점을 알려주는 것

  2. URL 중간의 매트릭스 매개 변수

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

    경로 변수 및을 사용하여 어디서나 매트릭스 매개 변수에 액세스 할 수 있습니다 @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;
    }

    응답

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

    매트릭스 매개 변수가 제공되기 때문에 MultivaluedMap당신은 각 액세스 할 수 있습니다

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

    또는 첫 번째 것만 필요한 경우

    String name = matrixParameters.getFirst("name");
  3. 모든 행렬 매개 변수를 하나의 메소드 매개 변수로 가져 오기

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

    를 사용하여 List<PathSegment>모두 가져 오기

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

    응답

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

10

댓글 섹션으로 강등되는 것이 너무 중요합니다.

매트릭스 URL과 관련하여 큰 문제가 무엇인지 잘 모르겠습니다. TBL이 쓴 w3c 디자인 기사에 따르면, 이것은 단지 디자인 아이디어 일 뿐이며 웹의 기능이 아니라고 명시 적으로 언급하고 있습니다. 상대 URL과 같은 것은 사용할 때 구현되지 않습니다. 당신이 그것을 사용하려면 괜찮습니다; 표준이 아니기 때문에 그것을 사용하는 표준 방법은 없습니다. – 스티브 포메 로이

즉, 비즈니스 목적으로 RS가 필요한 경우 요청 매개 변수를 사용하는 것이 좋습니다.


5
누군가 독특하다고 결정한 Angular 2 개발자에게 이것을 구현해야한다고 말합니다.
Matt Pileggi

2
@MattPileggi 나는 또한 Angular 2 때문에 이것을 읽고 있습니다. Angular 2의 거의 모든 측면은 고도로 전문화되어 있고, 기존의 사용 패턴과 상충됩니다. 이것이 아직 가치를 완화시키는 것은 아직 입증되지 않은 상태입니다.
Aluan Haddad 1

1
얘들 아, 나도 같은 이유로 여기에 있지만 각도 2 팀 github 페이지의 url matrix 및 google analytis에 관한이 문제와 관련 하여이 의견에 몇 가지 요점을 추가하겠습니다 .github.com / angular / angular / issues / 11740 그러나 그것에 대한 연구가 끝나면 URL 행렬 표기법 은 URL 쿼리 매개 변수보다 인간이 읽을 수있는 것처럼 보입니다 . 주로 중간 또는 URL 에 일부 매개 변수 가 필요할 때 (끝뿐만 아니라).
Richard Lee

8
나는 이것이 비표준이라고 생각하는 모든 사람들이 URI 템플릿 사양에 익숙하지 않다고 생각합니까? 경로 매개 변수에 복잡한 개체를 인코딩하는 것은 URI 템플릿의 매우 유용한 기능입니다. 대부분의 사람들이 그것을 알지 못하거나 사용한다고해서 그것은 각도 개발자들이 당신의 삶에 쓸모없는 복잡성을 주입한다는 악의 음모라는 것을 의미하지는 않습니다.
Ajax

2
Pffft- "<지금까지 몰랐던 것>은 표준 이 아니기 때문에 무지의 수용성을 유지합니다." TBL이 아이디어와 관련이 있거나 결정하지 않은 것은 크게 중요하지 않습니다. 2001 년 그의 웹 의 기능은 아니었다. 웹의 기능 은 클라이언트와 서버 구현자가 원하는대로 선택한다. Angular가 행렬 매개 변수를 지원하고 JAX-RS가이를 ​​지원하고이를 구현 도구로 선택한 경우 작동하는 것을 사용하십시오.
Dave
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.