Programing

URL 매트릭스 매개 변수와 요청 매개 변수

lottogame 2020. 5. 27. 07:32
반응형

URL 매트릭스 매개 변수와 요청 매개 변수


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

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

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

그러나 단점도 있습니다.

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

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

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


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

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

그것은 실제로 이름 공간으로 귀착됩니다. 쿼리 매개 변수 만 사용 된 경우 "category_name"및 "object_name"과 같은 매개 변수로 끝나고 요청 내의 매개 변수의 지역성에 의해 추가 된 명확성이 손실됩니다. 또한 JAX-RS와 같은 프레임 워크를 사용하는 경우 모든 쿼리 매개 변수가 각 자원 핸들러 내에 표시되어 잠재적 인 충돌 및 혼란을 초래합니다.

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


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

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

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


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]
    

    Since the matrix parameters are provided as a MultivaluedMap you can access each by

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

    or if you only need the first one

    String name = matrixParameters.getFirst("name");
    
  3. Get all matrix parameters as one method parameter

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

    Use a List<PathSegment> to get them all

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

    Response

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

참고URL : https://stackoverflow.com/questions/2048121/url-matrix-parameters-vs-request-parameters

반응형