[http] 중복 HTTP GET 쿼리 키의 권한있는 위치

HTTP GET 쿼리 문자열 중복 필드의 동작에 대한 권위있는 정보를 찾는 데 문제가 있습니다.

http://example.com/page?field=foo&field=bar

특히 주문이 유지되는지 여부. 대부분의 웹 지향 언어는 키 “필드”와 관련된 foo와 bar를 포함하는 배열을 생성하지만이 시점에 대해 권위있는 진술이 있는지 (예 : RFC에) 알고 싶습니다. RFC 3986 에는 3.4. Query키 = 값 쌍을 참조 하는 섹션이 있지만 순서를 해석하고 필드를 복제하는 방법에 대해서는 언급되어 있지 않습니다. RFC의 범위가 아닌 백엔드에 의존하기 때문에 이것은 의미가 있습니다 …

사실상의 표준이 존재하지만 호기심으로 인해 권위있는 소스를보고 싶습니다.



답변

이에 대한 사양이 없습니다 . 당신이 원하는 것을 할 수 있습니다.

일반적인 접근 방식에는 첫 번째, 마지막, 모든 배열, 쉼표와 함께 쉼표가 있습니다.

원시 요청이 다음과 같다고 가정하십시오.

GET /blog/posts?tag=ruby&tag=rails HTTP/1.1
Host: example.com

그런 다음 request.query['tag']언어 나 프레임 워크에 따라 산출해야하는 다양한 옵션이 있습니다 .

request.query['tag'] => 'ruby'
request.query['tag'] => 'rails'
request.query['tag'] => ['ruby', 'rails']
request.query['tag'] => 'ruby,rails'


답변

PHP (최소 버전 4.4.4 이상)에서는 다음과 같이 작동 함을 확인할 수 있습니다.

GET /blog/posts?tag=ruby&tag=rails HTTP/1.1
Host: example.com

결과 :

request.query['tag'] => 'rails'

그러나

GET /blog/posts?tag[]=ruby&tag[]=rails HTTP/1.1
Host: example.com

결과 :

request.query['tag'] => ['ruby', 'rails']

이 동작은 GET 및 POST 데이터에서 동일합니다.


답변

yfeldblum의 답변은 완벽합니다.

최근에 주목 한 다섯 번째 동작에 대한 참고 사항 : Windows Phone 에서 중복 쿼리 키로 URI를 사용하여 응용 프로그램을 열면 NavigationFailed가 발생합니다.

System.ArgumentException : 같은 키를 가진 항목이 이미 추가되었습니다.

범인은 System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults)입니다.

따라서 시스템이 원하는 방식으로 처리하지 못하게하여 금지합니다. 자신 만의 형식 (CSV, JSON, XML 등)과 uri-escape-it를 선택할 수있는 유일한 솔루션이 있습니다.


답변

프레임 워크의 대부분 (모두?)은 보증을 제공하지 않으므로 임의 순서로 리턴된다고 가정하십시오.

항상 가장 안전한 방법을 사용하십시오.

예를 들어, java HttpServlet 인터페이스 :
ServletRequest.html # getParameterValues

getParameterMap 메소드 에서도 매개 변수 순서에 대한 언급은 생략합니다 (java.util.Map 반복자의 순서도 신뢰할 수 없음).


답변

일반적으로 다음과 같은 중복 매개 변수 값

http://example.com/page?field=foo&field=bar

배열 인 단일 queryString 매개 변수가됩니다.

field[0]=='foo'
field[1]=='bar'

ASP, ASP.NET 및 PHP4에서이 동작을 보았습니다.


답변

나는 같은 질문을했다. 쿼리를 구문 분석하고 문자열 화하기 위해 자바 스크립트 함수를 작성 중입니다. 쿼리 문자열에 중복 이름이나 x [] = 1 & x [] = 2와 같이 대괄호가있는 이름이 있는지 여부는 알 수 없지만 일부 언어는 이러한 형식을 지원합니다.

그러나 Chrome과 Firefox에는 이름이 지정된 새로운 클래스가 URLSeachParams있으며 가장 간단한 형식 만 지원합니다 name=value. 쿼리 문자열에 중복 이름이있는 경우 첫 번째 이름 만 반환하는 get방법입니다 URLSearchParams.

따라서 개인적으로, 가장 단순하고 중복되는 이름 URL은 미래에 훨씬 더 안전합니다.


답변