URL 매트릭스 매개 변수와 요청 매개 변수
내 URL에 행렬 또는 쿼리 매개 변수를 사용할지 궁금합니다. 그 주제에 대한 오래된 토론 이 만족스럽지 않다는 것을 알았습니다 .
예
- 검색어 매개 변수가있는 URL : http : //some.where/thing? paramA = 1 & paramB = 6542
- 매트릭스 매개 변수가있는 URL : http : //some.where/thing; paramA = 1; paramB = 6542
첫눈에 매트릭스 매개 변수는 장점 만있는 것 같습니다.
- 더 읽기 쉬운
- 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로 행렬 매개 변수를 처리하는 방법에 대한 예를 제공하고자합니다 .
마지막 자원 요소의 매트릭스 매개 변수
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 점을 알려주는 것
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 byList<String> names = matrixParameters.get("name");
or if you only need the first one
String name = matrixParameters.getFirst("name");
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
'Programing' 카테고리의 다른 글
json.Unmarshal과 json.NewDecoder.Decode를 사용하여 JSON 디코딩 (0) | 2020.05.27 |
---|---|
“this”모듈의 소스 코드는 무엇입니까? (0) | 2020.05.27 |
공백 충돌없이 병합 (0) | 2020.05.27 |
이 코드는 어떻게 인도의지도를 생성합니까? (0) | 2020.05.27 |
Java 리플렉션에서 getFields와 getDeclaredFields의 차이점은 무엇입니까? (0) | 2020.05.27 |