배경 (아래 질문)
나는 이것을 풀기 위해 RFC와 SO 질문을 읽고 앞뒤로 인터넷 검색을 해 왔지만 여전히 잭이 없습니다.
그래서 저는 우리가 "최상의"답변에 투표하고 그게 다라고 생각합니다, 아니면?
기본적으로 이것으로 귀결됩니다.
3.4. 쿼리 구성 요소
쿼리 구성 요소는 리소스가 해석 할 정보 문자열입니다.
query = *uric
쿼리 구성 요소 내에서 ";", "/", "?", ":", "@", "&", "=", "+", ","및 "$"문자는 예약되어 있습니다.
나를 놀라게하는 첫 번째 것은 * uric이 이렇게 정의된다는 것입니다.
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
그러나 이것은 다음과 같은 단락에 의해 다소 명확 해집니다.
위의 "예약 된"구문 클래스는 URI 내에서 허용되지만 일반 URI 구문의 특정 구성 요소 내에서는 허용되지 않을 수있는 문자를 나타냅니다. 섹션 3에 설명 된 구성 요소의 구분 기호로 사용됩니다.
"reserved"세트의 문자는 모든 컨텍스트에서 예약되지 않습니다. 주어진 URI 구성 요소 내에 실제로 예약 된 문자 집합은 해당 구성 요소에 의해 정의됩니다. 일반적으로 문자가 이스케이프 된 US-ASCII 인코딩으로 대체되면 URI의 의미가 변경되면 문자가 예약됩니다.
이 마지막 발췌문은 다소 거꾸로 느껴지지만 예약 된 문자 집합이 컨텍스트에 따라 달라진다는 것을 분명히 나타냅니다. 그러나 3.4에서는 모든 예약 된 문자가 쿼리 구성 요소 내에 예약되어 있다고 명시하고 있지만 여기서 의미를 변경하는 유일한 것은 URI가 쿼리 문자열의 개념을 정의하지 않기 때문에 물음표 (?)를 이스케이프하는 것입니다.
이 시점에서 저는 RFC를 완전히 포기했지만 RFC 1738이 특히 흥미 롭다는 것을 알게되었습니다.
HTTP URL은 다음과 같은 형식을 취합니다.
http://<host>:<port>/<path>?<searchpart>
<path> 및 <searchpart> 구성 요소 내에서 "/", ";", "?" 예약되어 있습니다. HTTP 내에서 "/"문자를 사용하여 계층 구조를 지정할 수 있습니다.
적어도 RFC 1738이 RFC 2396을 대체하는 HTTP URL과 관련하여 이것을 해석합니다. URI 쿼리에는 쿼리 문자열에 대한 개념이 없기 때문에 예약 된 해석으로 인해 내가 익숙한 쿼리 문자열을 정의 할 수는 없습니다. 지금까지.
질문
이 모든 것은 다른 리소스의 요청과 함께 숫자 목록을 전달하고 싶을 때 시작되었습니다. 나는 그것에 대해 많이 생각하지 않고 쉼표로 구분 된 값으로 전달했습니다. 놀랍게도 쉼표가 이스케이프되었습니다. page.html?q=1,2,3
인코딩 된 쿼리 는 page.html?q=1%2C2%2C3
작동하지만 추악하고 예상하지 못했습니다. 그때부터 RFC를 시작했습니다.
내 첫 번째 질문은 단순히 쉼표를 인코딩하는 것이 정말 필요한가요?
RFC 2396에 따른 내 대답 : 예, RFC 1738에 따르면 : 아니요
나중에 요청 간 목록 전달에 관한 관련 게시물을 찾았습니다. csv 접근 방식이 나빠진 곳. 이것은 대신 나타났습니다 (이전에 본 적이 없음).
page.html?q=1;q=2;q=3
두 번째 질문은 유효한 URL입니까?
RFC 2396에 따른 내 대답 : 아니요, RFC 1738에 따른 : 아니요 (; 예약 됨)
숫자 인 한 csv를 전달하는 데 아무런 문제가 없지만 쉼표가 갑자기 다른 것에 필요한 경우 값을 앞뒤로 인코딩하고 디코딩해야 할 위험이 있습니다. 어쨌든 ASP.NET에서 세미콜론 쿼리 문자열을 시도했지만 결과가 예상과 다릅니다.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
"a"를 요청할 때 쉼표가있는 문자열이 표시되므로 이것이 csv 접근 방식과 얼마나 다른지 알 수 없습니다. ASP.NET은 확실히 참조 구현은 아니지만 아직 실망시키지 않았습니다.
그러나 가장 중요한 것은 제 세 번째 질문입니다. 이것에 대한 사양은 어디에 있습니까? 당신은 무엇을 하시겠습니까?